hihocoder 1636(2017北京区域赛J)(区间dp)
2017-11-23 17:59
513 查看
题目大意:石子归并的变形,但必须合并相邻的n堆(L<=n<=R)求最后合成一堆的最小时间,若不行则输出0
现场的时候没有想出来,状态方程很好想肯定是dp[i][j][k],代表i-j区间分成k堆的最小值,但是不会转移啊(菜)
正解是k=1,k>=1讨论
k=1的时候就把L<=n<=R这个限制用上了
k>=2的时候,因为k=1的时候得出的是最优解,转移到2一定也是最优解,都是枚举。
k = 1时
dp[i][j][1] = min(dp[i][j][1], dp[i][k][p] + dp[k+1][j][1] + sum[j] - sum[i-1]);
k >= 2时
dp[i][j][p] = min(dp[i][j][p], dp[i][k][p-1] + dp[k+1][j][1]);
当初有个疑问为什么方程中转移时候都是1,后来想想我觉得是因为枚举堆数的时候,类似于把右边的一堆一堆与左边合并,这样也就相当于枚举所有的情况了,所以都是1。
现场的时候没有想出来,状态方程很好想肯定是dp[i][j][k],代表i-j区间分成k堆的最小值,但是不会转移啊(菜)
正解是k=1,k>=1讨论
k=1的时候就把L<=n<=R这个限制用上了
k>=2的时候,因为k=1的时候得出的是最优解,转移到2一定也是最优解,都是枚举。
k = 1时
dp[i][j][1] = min(dp[i][j][1], dp[i][k][p] + dp[k+1][j][1] + sum[j] - sum[i-1]);
k >= 2时
dp[i][j][p] = min(dp[i][j][p], dp[i][k][p-1] + dp[k+1][j][1]);
当初有个疑问为什么方程中转移时候都是1,后来想想我觉得是因为枚举堆数的时候,类似于把右边的一堆一堆与左边合并,这样也就相当于枚举所有的情况了,所以都是1。
#include <iostream> #include <algorithm> #include <queue> #include <stack> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <set> #define LL long long #define maxn 110 #define INF 0x3f3f3f3f #define MOD 1000000007 using namespace std; int dp[maxn][maxn][maxn];//dp[i][j][k],表示i到j区间分成k份所需要的最小费用 int sum[maxn]; int main() { int n, l, r; while(scanf("%d%d%d",&n, &l, &r) == 3){ memset(sum, 0, sizeof(sum)); for(int i=1; i<=n; i++){ int x; scanf("%d",&x); sum[i] = sum[i-1] + x; } memset(dp, INF, sizeof(dp)); for(int i=1; i<=n; i++) for(int j=i; j<=n; j++) dp[i][j][j-i+1] = 0; for(int len=0; len<=n; len++){//区间长度 for(int i=1; i+len-1<=n; i++){//区间起点 int j = len + i - 1;//区间终点 for(int k=i; k<j; k++){ for(int p=l-1; p<=r-1; p++){ dp[i][j][1] = min(dp[i][j][1], dp[i][k][p] + dp[k+1][j][1] + sum[j] - sum[i-1]); } } for(int p=2; p<=len; p++){ for(int k=i; k<j; k++){ dp[i][j][p] = min(dp[i][j][p], dp[i][k][p-1] + dp[k+1][j][1]); } } } } if(dp[1] [1] == INF) printf("0\n"); else printf("%d\n",dp[1] [1]); } return 0; }
相关文章推荐
- Hihocoder 1259 :A Math Problem(2015 北京区域赛 K,二进制的数位dp)
- J - Pangu and Stones HihoCoder - 1636 (区间DP)
- hihoCoder 1636(2017北京icpc-j题)
- hihocoder 1636 : Pangu and Stones(区间dp)
- 【Hihocoder1636】Pangu and Stones(区间DP)
- HihoCoder - 1636 Pangu and Stones——区间dp
- HihoCoder-1586 Minimum(线段树,区间最值,ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
- hihocoder 1149 : 回文字符序列(区间dp)
- 2017 北京区域赛 J题
- 2017 ACM-ICPC 亚洲区(青岛赛区)网络赛 HDU 6212 1007 Zuma (区间DP)
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I.Minimum(线段树区间极值+分类讨论)
- hihoCoder - 1586 Minimum (2017 ACM-ICPC 亚洲区 (北京赛区) 网络赛 I)
- hihoCoder 1584 Bounce 【数学规律】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
- 2017 北京区域赛 J题
- hihoCoder挑战赛7 1001 正则表达式 (区间DP)
- hihocoder 1251 Today Is a Rainy Day( 2015北京区域赛C题)
- hihocoder 1251 Today Is a Rainy Day 2015北京区域赛C
- HDU 6212 Zuma ACM/ICPC 2017 Qingdao Online(区间dp)
- 2017 ACM/ICPC Asia Regional Qingdao Online 1007 hdu 6212 Zuma 区间dp
- 2017 ACM/ICPC Asia Regional Qingdao Online 1007 hdu 6212 Zuma (区间dp)