HihoCoder - 1636 Pangu and Stones(区间DP)
有n堆石子,每次你可以把相邻的最少L堆,最多R堆合并成一堆。
问把所有石子合并成一堆石子的最少花费是多少。
如果不能合并,输出0。
石子合并的变种问题。
用dp[l][r][k]表示将 l 到 r 之间的石子合并成 k 堆。
显然是k == 1 时,合并才是需要花费代价的。k >= 2时转移的时候不需要加代价。
这个我当时非常不理解。然后后来想想确实是这样的。因为k >= 2的状态必然是由 k == 1的时候转移过来的。
就是说将[l, r]分成k堆,必然要有几堆合并成一堆。
同理,合并区间长度限制的时候也只在k == 1的时候考虑就好了。
转移的时候分开按情况转移就好了。
记忆化搜索的形式老是TLE。我也不知道为啥。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = + ;
const int INF = 0x3f3f3f3f;
int n, L, R;
int dp[maxn][maxn][maxn];
int sum[maxn], a[maxn]; //int DP(int l, int r, int k)
//{
// if (k > r-l+1) return INF;
// if (k == r-l+1) return dp[l][r][k] = 0;
// if (dp[l][r][k] != INF) return dp[l][r][k];
//
// if (k == 1)
// {
// for (int j = L; j <= R; j++)
// for (int i = l; i <= r-1; i++)
// dp[l][r][k] = min(dp[l][r][k], DP(l, i, j-1)+DP(i+1, r, 1)+sum[r]-sum[l-1]);
// }
// else
// for (int i = l; i <= r-1; i++)
// dp[l][r][k] = min(dp[l][r][k], DP(l, i, k-1)+DP(i+1, r, 1));
//
// return dp[l][r][k];
//} int main()
{
while(~scanf("%d%d%d", &n, &L, &R))
{
for (int i = ; i <= n; i++) scanf("%d", &a[i]), sum[i] = sum[i-]+a[i]; memset(dp, INF, sizeof(dp)); //printf("%d %d\n", dp[1][1][1], 0x3f3f3f3f); for (int i = ; i <= n; i++)
for (int j = i; j <= n; j++)
dp[i][j][j-i+] = ; for (int len = ; len <= n; len++)
for (int l = ; l+len- <= n; l++)
{
int r = l+len-;
for (int j = ; j <= len; j++)
for (int k = l; k <= r-; k++)
dp[l][r][j] = min(dp[l][r][j], dp[l][k][j-]+dp[k+][r][]); for (int j = L; j <= R; j++)
for (int k = l; k <= r-; k++)
dp[l][r][] = min(dp[l][r][], dp[l][k][j-]+dp[k+][r][]+sum[r]-sum[l-]);
} // int ans = DP(1, n, 1);
printf("%d\n", dp[][n][]==INF ? :dp[][n][]);
}
}
HihoCoder - 1636 Pangu and Stones(区间DP)的更多相关文章
- hihocoder 1636 : Pangu and Stones(区间dp)
Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the first livi ...
- hihoCoder 1636 Pangu and Stones
hihoCoder 1636 Pangu and Stones 思路:区间dp. 状态:dp[i][j][k]表示i到j区间合并成k堆石子所需的最小花费. 初始状态:dp[i][j][j-i+1]=0 ...
- [ICPC 北京 2017 J题]HihoCoder 1636 Pangu and Stones
#1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...
- icpc 2017北京 J题 Pangu and Stones 区间DP
#1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...
- 2017北京网络赛 J Pangu and Stones 区间DP(石子归并)
#1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...
- HihoCoder 1636 Pangu and Stones(区间DP)题解
题意:合并石子,每次只能合并l~r堆成1堆,代价是新石堆石子个数,问最后能不能合成1堆,不能输出0,能输出最小代价 思路:dp[l][r][t]表示把l到r的石堆合并成t需要的最小代价. 当t == ...
- 2017ICPC北京 J:Pangu and Stones
#1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...
- Pangu and Stones HihoCoder - 1636 区间DP
Pangu and Stones HihoCoder - 1636 题意 给你\(n\)堆石子,每次只能合成\(x\)堆石子\((x\in[L, R])\),问把所有石子合成一堆的最小花费. 思路 和 ...
- Pangu and Stones(HihoCoder-1636)(17北京OL)【区间DP】
题意:有n堆石头,盘古每次可以选择连续的x堆合并,所需时间为x堆石头的数量之和,x∈[l,r],现在要求,能否将石头合并成一堆,如果能,最短时间是多少. 思路:(参考了ACM算法日常)DP[i][j] ...
随机推荐
- sublime格式化HTML+CSS插件--HTML-CSS-JS Prettify
介绍 在工作中经常会下载不同项目的源码,可能是压缩的原因,其中一些代码的格式十分的乱,这样就会导致阅读起来十分的不方便,所以下面介绍一个sublime的插件:HTML-CSS-JS Prettify ...
- devExpress GridControl gridView笔记
gridView1.Appearance.EvenRow.BackColor = Color.FromArgb(, , , ); gridView1.Appearance.OddRow.BackCol ...
- spring-boot整合shiro作权限认证
spring-shiro属于轻量级权限框架,即使spring-security更新换代,市场上大多数企业还是选择shiro 废话不多说 引入pom文件 <!--shiro集成spring--& ...
- Vue.js(2.x)之条件渲染
1.v-if:这里的官网文档看完后赶脚v-if就是用来判断元素是显示还是隐藏. 2.template这个包装元素感觉挺好用,以后把需要某些特定操作才出现的元素存放进去挺好. 3.前面看的网友写的还可以 ...
- 关于第三方dll,ocx开发的思考
A问题: 最近有个工作,要集成一套老的指纹考勤机器到现在考勤系统(web系统)中,问题出现时老的机器只有ocx可用,没有可用的dll:原本以为简单的第三方调用就ok了,可是ocx不能被承载,在实现上费 ...
- Yii2 components api/controller
When we wrote API, those controllers need to implement the following feature: 1. return JSON format ...
- Visual Studio 更改护眼颜色
- SSH中懒加载异常--could not initialize proxy - no Session
SSH进行关联的表进行显示时出现的问题,老是显示你的OGNL表达式错误,但是找了很久确实没错,在网上找了一下,下面的这个方法本人认为是最有效的方法(已经测试可以使用) 在web.xml中加入 程序代码 ...
- hihoCoder 挑战赛10 #1144 : 01串
思路:这只是逻辑测试题吧,考虑周全就行了.考虑n=m的情况,n>m的情况,m>n的情况. (1)n>m的情况,0比1多几个都是行的,一共有m个“01”,后面补足够多个零即可. (2) ...
- webpack最简单的入门教程里bundle.js之运行单步调试的原理解析
读这篇文章的朋友,请确保对webpack有最基础的认识. 您可以阅读我前一篇文章:Webpack 10分钟入门 来在本地运行一个Webpack的hello world项目.https://www.to ...