想法:简单区间规划
动态转移方程: mp[j][i+j]=min(mp[j][i+j],mp[j][k]+mp[k+1][i+j]+sum[i+j]-sum[j-1]);
mp【i】【i+j】保存从a【i】开始长度为j的和
代码:
#include<stdio.h> #include<string.h> int a[210]; int mp[210][210]; int sum[210]; int min(int x,int y) {return x<y?x:y;} int main() { int n; while(scanf("%d",&n)!=EOF) { int i,j,k; for(i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i];//前i项和 } for(i=1;i<n;i++) for(j=1;j<=n;j++) mp[i][j]=i==j?0:9999999; for(i=1;i<=n;i++)//区间开始点 { for(j=1;j<=n-i;j++)//区间长度 for(k=j;k<=i+j-1;k++)//区间中的点 mp[j][i+j]=min(mp[j][i+j],mp[j][k]+mp[k+1][i+j]+sum[i+j]-sum[j-1]); } printf("%d\n",mp[1][n]); } return 0; }
