這個題目很容易想出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; }
buct_1725 石子合并 (區間DP+四邊形不等式優化)
最新推荐文章于 2021-10-28 22:29:21 发布