合并游戏 737(区间Dp
2017-07-27 18:27
141 查看
石子合并(一)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
输入
有多组测试数据,输入到文件结束。
每组测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开
输出
输出总代价的最小值,占单独的一行
样例输入
3
1 2 3
7
13 7 8 16 21 4 18
样例输出
9
239
做法:区间dp解决区间问题,想要求合并1~5的最小值,必须先把子集内最小值求出,那么一个较大的集合可以由很多子集构成,那么可以把长度为1的子集先求出,再求子集为2的,
比如1~5:1 2 3 4 5
先求出1~2,2~3,3~4,4~5,
再求出1~3的最小值,1~3的最小值可能是1+2~3或1~2+3,那么就是
dp[i][j]=dp[i][k]+dp[k+1][j],k的取值范围就变成了[i,j)。
同上,最后一直推到dp[1][5]即可。
加sum[i+j]-sum[j-1],就是因为它的总和一定会需要j~i+j项相加,
比如1 2 3相加一样,1 2 3这三个数一定会相加的。
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
输入
有多组测试数据,输入到文件结束。
每组测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开
输出
输出总代价的最小值,占单独的一行
样例输入
3
1 2 3
7
13 7 8 16 21 4 18
样例输出
9
239
做法:区间dp解决区间问题,想要求合并1~5的最小值,必须先把子集内最小值求出,那么一个较大的集合可以由很多子集构成,那么可以把长度为1的子集先求出,再求子集为2的,
比如1~5:1 2 3 4 5
先求出1~2,2~3,3~4,4~5,
再求出1~3的最小值,1~3的最小值可能是1+2~3或1~2+3,那么就是
dp[i][j]=dp[i][k]+dp[k+1][j],k的取值范围就变成了[i,j)。
同上,最后一直推到dp[1][5]即可。
加sum[i+j]-sum[j-1],就是因为它的总和一定会需要j~i+j项相加,
比如1 2 3相加一样,1 2 3这三个数一定会相加的。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f; int a[205],sum[205]; int dp[205][205]; int main() { int n; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); memset(sum,0,sizeof(sum)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) i==j?dp[i][j]=0:dp[i][j]=inf; //memset(dp,0,sizeof(dp)); for(int i=0; i<n; i++) scanf("%d",&a[i]); sum[0]=a[0]; for(int i=1;i<n;i++) sum[i]=a[i]+sum[i-1]; for(int i=1;i<n;i++) { for(int j=0;j<n-i;j++) { for(int k=j;k<i+j;k++) { //printf("%d %d %d %d\n",j,i+j,dp[j][i+j],sum[i+j]-sum[j-1]); dp[j][i+j]=min(dp[j][i+j],dp[j][k]+dp[k+1][i+j]+sum[i+j]-sum[j-1]); //printf(" %d %d %d %d\n",j,i+j,dp[j][i+j],sum[i+j]-sum[j-1]); } } } printf("%d\n",dp[0][n-1]); } return 0; }
相关文章推荐
- nyoj 737 石子合并(一)(区间DP)
- 区间DP-NYOJ737石子合并
- nyoj737石子合并(一)【区间dp】
- nyoj 737 石子合并(一)(区间DP)
- NYOJ737 石子合并(一)(区间dp,详细)
- nyoj737区间dp(石子合并)
- NYoj737 石子合并(区间dp)
- nyoj 737 石子合并(一)(区间DP)
- nyoj 737 石子合并(一)(区间DP)
- (区间dp)南阳理工 acm 737 石子合并(一)
- Nyoj 737: 石子合并(一)(区间DP+四边形优化)
- 【区间DP】NYOJ 737石子合并+POJ 2955 Brackets(括号匹配)+NYOJ 15 括号匹配(二)
- nyoj 737 石子合并(一)(区间DP)
- nyoj 737 石子合并(一)(区间DP)
- nyoj 737 石子合并(一) 区间dp
- nyoj 737 石子合并(一)(区间DP)
- nyoj 737 石子合并(一)(区间DP)
- nyoj 737 石子合并(一)。区间dp
- NYOJ 737 石子合并(一)(区间dp)
- NYOJ - 737 - 石子合并(一)(区间DP)