http://acm.hdu.edu.cn/showproblem.php?pid=4283
dp[i][j]代表只考虑i到j的最小怒气值 dp[i][j]从dp[i+1][j]转移过来 枚举i插在什么位置即可
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e2+10;
int dp[maxn][maxn];
int ary[maxn],sum[maxn];
int n;
int main()
{
int t,cas,l,i,j,k;
scanf("%d",&t);
for(cas=1;cas<=t;cas++){
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&ary[i]);
sum[i]=sum[i-1]+ary[i];
}
memset(dp,0x3f,sizeof(dp));
for(i=1;i<=n;i++){
dp[i][i]=0;
}
for(l=2;l<=n;l++){
for(i=1;i+l-1<=n;i++){
j=i+l-1;
dp[i][j]=min(dp[i+1][j]+sum[j]-sum[i],dp[i+1][j]+ary[i]*(l-1));
for(k=i+1;k<=j-1;k++){
dp[i][j]=min(dp[i][j],dp[i+1][k]+ary[i]*(k-i)+dp[k+1][j]+(sum[j]-sum[k])*(k-i+1));
}
}
}
printf("Case #%d: %d\n",cas,dp[1][n]);
}
return 0;
}