四边形不等式优化;
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> #include<cmath> #include<queue> #include<map> #include<stack> #include<set> using namespace std; typedef long long ll; const int maxn=1010; const int inf=0xfffffff; int n; int a[maxn]; int dp[maxn][maxn]; int sum[maxn]; int p[maxn][maxn]; int main(){ int i,j,k; while(~scanf("%d",&n)){ for(i=1;i<=n;++i){ scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; p[i][i]=i; dp[i][i]=0; } if(n==1){ printf("%d\n",a[1]); continue; } if(n==2){ printf("%d\n",a[1]+a[2]); continue; } int len; for(len=2;len<=n;++len){ for(i=1;i+len-1<=n;++i){ j=i+len-1; dp[i][j]=inf; for(k=p[i][j-1];k<=p[i+1][j];++k){ int s=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]; if(s<dp[i][j]){ dp[i][j]=s; p[i][j]=k; } } } } printf("%d\n",dp[1][n]); sum[0]=0; } return 0; }
