http://wikioi.com/problem/1154/
这是石子归并的加强版,基本就是分治法的DP。但是有了个环,因为任何一个位置都可开始,所以就建立2*N的数组,然后对可能的区间遍历一次,就是O(n^3)的复杂度。
中间错误的地方有:
# 把dp(i,j)错误写成F[i][j]
# k不能等于i,也不能等于j
# 把A[i]*A[k]*A[j]错写成i*k*j
#include <cstdio> #include <iostream> #include <algorithm> #include <memory.h> #define MAX(a, b) a>b?a:b #define LEN 105 using namespace std; int A[LEN*2]; int F[LEN*2][LEN*2]; int N; void init() { scanf("%d", &N); for (int i = 1; i <= N; i++) { scanf("%d", &A[i]); A[i+N] = A[i]; } for (int i = 1; i <= N*2; i++) { for (int j = 1; j <= N*2; j++) { F[i][j] = -1; } } } int dp(int i, int j) { if (F[i][j] != -1) { return F[i][j]; } if (i == j || i+1 == j) return 0; int max = 0; for (int k = i+1; k <= j-1; k++) { int tmp = dp(i, k) + dp(k, j) + A[i]*A[k]*A[j]; if (tmp > max) max = tmp; } F[i][j] = max; return max; } int main() { init(); int ans = 0; for (int i = 1; i <= N; i++) { int tmp = dp(i, i+N); ans = MAX(tmp, ans); } printf("%d ", ans); return 0; }