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]
解题: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
相关文章推荐
- nyoj 737 石子合并(一)。区间dp
- nyoj 737 石子合并(一)(区间DP)
- NYOJ737 石子合并(一)(区间dp,详细)
- NYOJ 737 石子合并(一) (区间DP+平行四边形优化)
- NYOJ 737 石子合并(一)(区间DP、平行四边形优化、GarsiaWachs算法)
- nyoj 737 石子合并(一)(区间DP)
- nyoj 737 石子合并(一)(区间DP)
- NYOJ - 737. 石子合并(一)
- nyoj 737 合并石子一(dp)
- nyoj 737 石子合并(一)(区间DP)
- nyoj-737石子合并(一)
- NYoj - 737 - 石子合并(一)最详细的详解(区间DP入门题)
- nyoj 737 石子合并(一) 【区间dp】
- NYOJ 737 石子合并(一)(区间dp)
- NYOJ - 737 - 石子合并(一)(区间DP)
- nyoj 737 石子合并(一)(区间DP)
- nyoj737区间dp(石子合并)
- nyoj 737 石子合并(一)(区间DP)
- nyoj737石子合并(一)【区间dp】
- nyoj 737 石子合并(一)(区间DP)