0x58B 四边形不等式
还有优化二维区间DP的,形如f[i][j]min{f[i][k]+f[k][j+1]+val(i,j)}
其中val满足四边形不等式,而且对于任意a<=b<=c<=d满足val(a,d)>=val(b,c)
那么f也满足四边形不等式
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int s[310]; int f[310][310],p[310][310]; int main() { int n,x; scanf("%d",&n); s[0]=0; for(int i=1;i<=n;i++) scanf("%d",&x), s[i]=s[i-1]+x, p[i][i]=i; for(int i=2;i<=n;i++) for(int l=1;l+i-1<=n;l++) { int r=l+i-1;f[l][r]=(1<<30); for(int k=p[l][r-1];k<=p[l+1][r];k++) { int d=f[l][k]+f[k+1][r]+s[r]-s[l-1]; if(d<f[l][r]) { f[l][r]=d; p[l][r]=k; } } } printf("%d\n",f[1][n]); return 0; }
pain and happy in the cruel world.