经典的石子合并问题,代价w(i,j)满足四边形不等式的性质,所以可以通过决策的单调性求解
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N = 500; int f[N][N]; int p[N][N]; int n; int sum[N]; int main(){ cin>>n; int x; for(int i=1;i<=n;i++){ cin>>x; sum[i]=sum[i-1]+x; } memset(f,0x3f,sizeof f); memset(p,0,sizeof p); for(int i=1;i<=n;i++)f[i][i]=0,p[i][i]=i; for(int len=2;len<=n;len++) for(int i=1;i+len-1<=n;i++) { int j=i+len-1; for(int k=p[i][j-1];k<=p[i+1][j];k++){ if(f[i][j]>f[i][k]+f[k+1][j]+sum[j]-sum[i-1]){ f[i][j]=f[i][k]+f[k+1][j]+sum[j]-sum[i-1]; p[i][j]=k; } } } cout<<f[1][n]<<endl; }