有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)的更多相关文章

  1. hihocoder 1636 : Pangu and Stones(区间dp)

    Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the first livi ...

  2. 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 ...

  3. [ICPC 北京 2017 J题]HihoCoder 1636 Pangu and Stones

    #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...

  4. icpc 2017北京 J题 Pangu and Stones 区间DP

    #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...

  5. 2017北京网络赛 J Pangu and Stones 区间DP(石子归并)

    #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...

  6. HihoCoder 1636 Pangu and Stones(区间DP)题解

    题意:合并石子,每次只能合并l~r堆成1堆,代价是新石堆石子个数,问最后能不能合成1堆,不能输出0,能输出最小代价 思路:dp[l][r][t]表示把l到r的石堆合并成t需要的最小代价. 当t == ...

  7. 2017ICPC北京 J:Pangu and Stones

    #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...

  8. Pangu and Stones HihoCoder - 1636 区间DP

    Pangu and Stones HihoCoder - 1636 题意 给你\(n\)堆石子,每次只能合成\(x\)堆石子\((x\in[L, R])\),问把所有石子合成一堆的最小花费. 思路 和 ...

  9. Pangu and Stones(HihoCoder-1636)(17北京OL)【区间DP】

    题意:有n堆石头,盘古每次可以选择连续的x堆合并,所需时间为x堆石头的数量之和,x∈[l,r],现在要求,能否将石头合并成一堆,如果能,最短时间是多少. 思路:(参考了ACM算法日常)DP[i][j] ...

随机推荐

  1. docker exit status 255解决

    一 windows开发整docker就是痛苦,在公司win7电脑想拿起几年没再用的docker 结果直接报错 Error getting IP address: ssh command error: ...

  2. node官方docker镜像运行bower 提示 permission denied 解决方法

    在使用node官方docker镜像部署node应用时,应用需要npm的scripts中运行bower install 来安装前端包,但是用docker 构建时失败,提示 permission dein ...

  3. String与Date转换

    public class TimeTraining { public static void changeStr(String str){ str = "137878"; } pu ...

  4. 关于第三方dll,ocx开发的思考

    A问题: 最近有个工作,要集成一套老的指纹考勤机器到现在考勤系统(web系统)中,问题出现时老的机器只有ocx可用,没有可用的dll:原本以为简单的第三方调用就ok了,可是ocx不能被承载,在实现上费 ...

  5. hihoCoder 挑战赛10 #1144 : 01串

    思路:这只是逻辑测试题吧,考虑周全就行了.考虑n=m的情况,n>m的情况,m>n的情况. (1)n>m的情况,0比1多几个都是行的,一共有m个“01”,后面补足够多个零即可. (2) ...

  6. HDU1043 八数码(BFS + 打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 , 康托展开 + BFS + 打表. 经典八数码问题,传说此题不做人生不完整,关于八数码的八境界 ...

  7. linux 命令——12 more (转)

    more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...

  8. JS每点击一次添加多少条数据

    很久不写文档,平时只写日记,所以对这个有点生疏,如果写的不好别介意. 今天闲的蛋疼,于是要写写白天的东西,并且以后也会一直更新(一直写)下去. 时间太仓促了,这几个月,今天算最晚的一次凌晨1点,吃不消 ...

  9. IOS 获取文本焦点 主动召唤出键盘(becomeFirstResponder) and 失去焦点(退下键盘)

    主动召唤出键盘 - (void)viewDidAppear:(BOOL)animated { // 3.主动召唤出键盘 [self.nameField becomeFirstResponder]; / ...

  10. 如何解决EXCEL中的科学计数法

    EXCEL虽然能够有效的处理数据,尤其是数字的计算.但是,在单元格中输入数字的时候,很多时候都会受到科学计算法的困扰. 当单元格中输入的数字,超过11位时,就会自动变成科学计数法.无论您怎么调整列的宽 ...