注意点:
- f[i][j]初始值应当设为零,由题目性质可知直接利用sum[j]-sum[i-1]更新答案即可.
#include<cstdio> #include<iostream> using namespace std; const int MAXN=8e3,INF=2e9; int f[MAXN][MAXN];//最小复杂度 int s[MAXN][MAXN];//中转点 int sum[MAXN];//前缀和 int a[MAXN]; int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); s[i][i]=i; sum[i]=sum[i-1]+a[i]; } for(int i=n+1;i<=2*n;i++){ s[i][i]=i; sum[i]=sum[i-1]+a[i-n]; } for(int i=2*n-1;i>=1;i--){ for(int j=i+1;j<=2*n;j++){ int bestK; int minn=INF;//最小值 for(int k=s[i][j-1];k<=s[i+1][j];k++){ if(minn>f[i][k]+f[k+1][j]+(sum[j]-sum[i-1])){ minn=f[i][k]+f[k+1][j]+(sum[j]-sum[i-1]); bestK=k; } } f[i][j]=minn; s[i][j]=bestK; } } int ans=INF; for(int i=1;i<=n;i++) ans=min(ans,f[i][i+n-1]); printf("%d ",ans); return 0; }