這個題目很容易想出O(n^3)的算法,但是會超時的,可以由於條件符合四變形不等式,可以將時間複雜度優化到O(N^2).
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 1001
int f[MAXN][MAXN], val[MAXN], s[MAXN][MAXN], g[MAXN][MAXN];
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int n;
while( ~scanf("%d", &n) ) {
for(int i = 1; i <= n; i ++) {
scanf("%d", &val[i]);
}
memset(s, 0, sizeof(s));
memset(g, 0, sizeof(g));
memset(f, 0x3F, sizeof(f));
for(int i = 1; i <= n; i ++) {
f[i][i] = 0;
g[i][i] = i;
for(int j = i; j <= n; j ++) {
s[i][j] = s[i][j-1]+val[j];
}
}
for(int z = 2; z <= n; z ++) {
for(int i = 1; i <= n-z+1; i ++) {
int j = i+z-1;
for(int k = max(i, g[i][j-1]); k <= g[i+1][j]; k ++) {
//f[i][j] = min(f[i][j], f[i][k]+f[k+1][j]+s[i][j]);
if( f[i][j] > f[i][k]+f[k+1][j]+s[i][j] ) {
f[i][j] = f[i][k]+f[k+1][j]+s[i][j];
g[i][j] = k;
}
}
}
}
printf("%d\n", f[1][n]);
}
return 0;
}