有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. JSONP 回调给全局变量赋值失败解决

    ;//回调结束标志位var 临时全局变量;var 需要接收的全局变量: function getDate(){ flag = 0; //回调 inviteService.getActivityDeta ...

  2. Sublime Text3安装SublimeGit插件

    之前一直用PhpStorm作为开发工具,但是最近使用的一台电脑上安装的老是卡死,只好用回Sublime Text3. 搜索后打开第一个链接“Sublime Text 3中使用SublimeGit插件” ...

  3. 一些C/C++中的函数

    项目中使用到的C/C++中的一些函数,记录下来加以理解和掌握. 1.memset( ) memset是计算机中C/C++语言函数.将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASC ...

  4. 使用HTML5 canvas做地图(3)图片加载平移放大缩小

    终于开始可以写代码了,手都开始痒了.这里的代码仅仅是在chrome检测过,我可以肯定的是IE10以下浏览器是行不通,我一直在考虑,是不是使用IE禁止看我的篇博客,就是这群使用IE的人,给我加了很多工作 ...

  5. LaTeX 符号大全

    常用数学符号的 LaTeX 表示方法 2016-10-31 16:22 | 黄荣生   常用数学符号的 LaTeX 表示方法 1.指数和下标可以用^和_后加相应字符来实现.比如: 2.平方根(squa ...

  6. Java static修饰符小记

    首先我们明确一点:java是一个纯面向对象的编程语言,它的每一个文件都视为一个类,当我们创建一个对象的时候,就是在调用一个文件,那么这个时候,这个文件(类)里的一些东西,它是需要通过对象来使用或访问, ...

  7. 用rem实现h5页面的编写

    一 静态页面的布局 将这段代码加到script中 (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orienta ...

  8. JavaScript:理解Promise方法

    什么是promise? Promise的核心思想是代表异步操作的一个结果,并且promise具有三个状态(pending初始状态,fulfilled成功状态,rejected失败状态).我们可以理解为 ...

  9. IOS Quartz2D自定义view

    @property (nonatomic, weak) UIImageView *imageView; @property (nonatomic, weak) NJImageView *njIv; @ ...

  10. python实现栈的算法

    以下来源“悟空”的讲课视频,我只是对内容加深以下理解,做一些说明: 栈作为一种数据结构,是一种只能在一端进行插入和删除操作.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要 ...