nyoj737 石子合并(一)
来源:互联网 发布:淘宝上没有s 编辑:程序博客网 时间:2024/05/18 03:09
石子合并(一)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
- 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
- 输入
- 有多组测试数据,输入到文件结束。
每组测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开 - 输出
- 输出总代价的最小值,占单独的一行
- 样例输入
31 2 3713 7 8 16 21 4 18
- 样例输出
9239
给出n堆石头,每次可以将相邻两堆石头合并,代价是石头数量和,求最小代价。
dp[i][j]代表从第i堆到第j堆的最优值,然后再从2堆的状态推到n堆的状态。
#include<iostream>#include<cstring>#include<cstdio>using namespace std;const long long int N=10000007;int main(){int n;while(~scanf("%d",&n)){ int a[222]; int sum[222]; int i; sum[0]=0; for(i=1;i<=n;i++) { cin>>a[i]; if(i==1)sum[i]=a[i]; else sum[i]=sum[i-1]+a[i]; } int dp[222][222]; int j,k; memset(dp,0,sizeof(dp)); for(i=2;i<=n;i++) { for(j=1;j<=n-i+1;j++) { k=j+i-1; dp[j][k]=99999999; for(int s=j;s<k;s++) { dp[j][k]=min(dp[j][k],dp[j][s]+dp[s+1][k]+sum[k]-sum[j-1]); } } } cout<<dp[1][n]<<endl;}return 0;}
阅读全文
0 0
- NYOJ737石子合并(一)
- NYOJ737石子合并(一)
- nyoj737 石子合并(一)
- nyoj737石子合并(一)【区间dp】
- nyoj737 石子合并(一) 区间DP
- NYOJ737:石子合并(一)(区间dp入门)
- nyoj737 石子合并(一)(区间dp)
- NYOJ737 石子合并(一)(区间dp,详细)
- NYoj737 石子合并(区间dp)
- nyoj737 区间dp(合并石子)
- NYOJ737 石子合并(区间DP)
- NYOJ737-石子合并
- nyoj737 石子合并 详细
- nyoj737石子合并
- nyoj737 石子合并
- nyoj737石子合并
- nyoj737石子合并【区间dp】
- nyoj737 石子合并 区间dp
- react-navigation使用技巧
- CWnd与HWND的区别与转换
- mysql 计算时间
- 不要听吹牛逼什么前端MVVM框架就是好,其实都是一帮没学好分层设计的搞出来的,让你彻底看清前端MVVM的本质
- intellj IDEA小知识
- nyoj737 石子合并(一)
- 苹果核
- 游戏制作学习资料
- 攒货
- python 字典中的copy函数的浅拷贝问题
- java.lang.Object.clone()分析
- Python -- Html转PDF
- jquery获取表格中所有的checkbox并遍历
- 枚举--hdu5936 difference