#include<stdio.h>
#define N 205
#define MAX0xfffffff
int sum[N];
int stone[N];
int dp[N][N];
int min(int a,intb)
{
return a<b?a:b;
}
int main()
{
int n;
int i,j,d,k,add;
while(scanf("%d",&n)!=EOF)
{
sum[0]=stone[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&stone[i]);
sum[i]=sum[i-1]+stone[i];//用于计算n块石头的重量
dp[i][i]=0;//把一块石头合并成一块石头不需要体力
}
for(d=1;d<n;d++)//将d+1块石头合并
for(i=1;i<=n-d;i++)
{
j=i+d;
dp[i][j]=MAX;
add=sum[j]-sum[i-1];
for(k=i;k<j;k++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+add);
}
printf("%d\n",dp[1][n]);
}
}
NYOJ737石子合并(一)
最新推荐文章于 2018-09-30 19:41:00 发布