您的位置:首页 > 其它

NYOJ 737 石子合并(一)

2014-07-17 20:38 190 查看

[b]石子合并(一)[/b]

时间限制:1000ms|内存限制:65535KB
难度:3

[b]描述[/b]有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。

[b]输入[/b]有多组测试数据,输入到文件结束。
每组测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0<n<200)个数,分别表示这n堆石子的数目,用空格隔开[b]输出[/b]输出总代价的最小值,占单独的一行[b]样例输入[/b]
3
123
7
13781621418

[b]样例输出[/b]
9
239

[b]来源[/b]经典问题[b]上传者[/b]TC_胡仁东
解题:dp...其实就是把这条直线先化成长度为1的一段一段一段的,然后化成长度为2的一段一段的。。。。。。。。最优子结构。。。。拼出0-n-1的最优解


#include<iostream>
#include<cstdio>
#include<climits>
usingnamespacestd;
intd[50010],n;
intmain(){
inti,j,ans,temp;
while((~scanf("%d",&n))&&n){
for(i=1;i<=n;i++)
scanf("%d",d+i);
d[0]=d[n+1]=INT_MAX;
ans=0;
while(n>=2){
for(i=2;i<=n;i++)if(d[i-1]<d[i+1])break;
temp=d[i-1]+d[i];
ans+=temp;
for(j=i-1;j&&temp>d[j-1];j--)d[j]=d[j-1];
d[j]=temp;
for(j=i;j<=n;j++)d[j]=d[j+1];
n--;
}
printf("%d\n",ans);
}
return0;
}


ViewCode



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: