您的位置:首页 > 其它

合并石子

2015-06-06 14:11 225 查看
代码是参考ACdreamers敲的。

相邻石子合并,找最小代价。

#include <cstdio>
#include <algorithm>
using namespace std;

int a[110];
int dp[110][110];
int sum[110];
int n;

int getmin()
{
for(int i=0;i<=n;i++)
dp[i][i]=0;
for(int v=1;v<n;v++)//v所代表的是当合并间隔为v的时候,遍历全部石子,找俩俩石子合并需要的最小代价。v的范围是[0,n-1]
{
for(int i=0;i<n-v;i++)//找[i,j]这个区间内的最小代价,当然,i的范围是[0,n-v-1];
{
int j=i+v;
dp[i][j]=0xffffff;
int temp=sum[j]-(i>0 ? sum[i-1] : 0);//求[i,j]区间内的所有石子的和。sum[j]-sum[i].
for(int k=i;k<j;k++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+temp);这 就是递推式的含义了
}
}
return dp[0][n-1];
}
int main()
{
scanf ("%d",&n);
for(int i=0;i<n;i++)
scanf ("%d",&a[i]);
sum[0]=a[0];
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+a[i];
//printf("%d %d\n",sum[i],i);
}
printf("%d\n",getmin());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: