Pangu and Stones HihoCoder - 1636 区间DP
Pangu and Stones HihoCoder - 1636
题意
给你\(n\)堆石子,每次只能合成\(x\)堆石子\((x\in[L, R])\),问把所有石子合成一堆的最小花费。
思路
和合石子的那题很像,多加了的一个限制,所有我们可以想到要多开一维数组来计算。
\(dp[i][j][x]:\)表示区间\([i, j]\)的范围内有\(x\)堆石子。
然后我们要分成两类讨论(\(sum[i]\)表示前\(i\)堆石子的和)
\(1\)、\(dp[i][j][1] = min(dp[i][j][x] + sum[j]-sum[i-1], dp[i][j][1]) \ \ x\in[L, R]\)
\(x\)堆合并成一堆
\(2\)、\(dp[i][j][x] =min(dp[i][k][1]+d[k+1][j][x-1], dp[i][j][x]) \ \ x\in[2, min(j-i+1, R)]\)
算区间\([i, j]\)里有\(x\)堆石子的最小花费
(练习赛的时候,思路大方向没错,但是区间DP完全写错,怎么也写不出来正解。。。在被队友打死的边缘试探)
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define mes(a, b) memset(a, b, sizeof a)
using namespace std;
typedef long long ll;
const int maxn = 1e2+10;
const ll inf = 1e17;
ll dp[maxn][maxn][maxn];
ll sum[maxn];
int main(){
    int n, l, r;
    while(scanf("%d%d%d", &n, &l, &r) !=EOF){
        sum[0] = 0;
        for(int i = 1; i <= n; i++){
            scanf("%lld", &sum[i]);
            sum[i] += sum[i-1];
        }
        for(int i = 1; i <= n; i++){
            for(int j = i; j <= n; j++){
                for(int k = 1; k <= j-i+1; k++){
                    dp[i][j][k] = inf;
                }
                dp[i][j][(j-i+1)] = 0;
            }
        }
        for(int len = 2; len <= n; len++){  //枚举长度
            for(int i = 1; i+len-1 <= n; i++){  //枚举左端点
                int j = i+len-1;  //根据长度和左端点,得出右端点
                for(int x = 2; x <= min(len, r); x++){  //枚举区间石子堆数
                    for(int k = i; k < j && k <= j-x+1; k++){  //枚举中间断点
                    // j-(k+1)+1>=x-1  =>  k <= j-x+1, 区间石子数不能大于区间长度
                        dp[i][j][x] = min(dp[i][j][x], dp[i][k][1]+dp[k+1][j][x-1]);
                    }
                    if(x >= l)
                        dp[i][j][1] = min(dp[i][j][1], dp[i][j][x]+sum[j]-sum[i-1]);
                }
            }
        }
        if(dp[1][n][1] >= inf)
            printf("0\n");
        else
            printf("%lld\n", dp[1][n][1]);
    }
    return 0;
}
Pangu and Stones HihoCoder - 1636 区间DP的更多相关文章
- 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 ... 
- hihocoder 1636 : Pangu and Stones(区间dp)
		Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the first livi ... 
- [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 ... 
- Pangu and Stones(HihoCoder-1636)(17北京OL)【区间DP】
		题意:有n堆石头,盘古每次可以选择连续的x堆合并,所需时间为x堆石头的数量之和,x∈[l,r],现在要求,能否将石头合并成一堆,如果能,最短时间是多少. 思路:(参考了ACM算法日常)DP[i][j] ... 
- hihoCoder #1320 : 压缩字符串 区间dp
		/** 题目:hihoCoder #1320 : 压缩字符串 链接:https://hihocoder.com/problemset/problem/1320 描述 小Hi希望压缩一个只包含大写字母' ... 
- 【HIHOCODER 1320】压缩字符串(区间DP)
		描述 小Hi希望压缩一个只包含大写字母'A'-'Z'的字符串.他使用的方法是:如果某个子串 S 连续出现了 X 次,就用'X(S)'来表示.例如AAAAAAAAAABABABCCD可以用10(A)2( ... 
- 2017ICPC北京 J:Pangu and Stones
		#1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ... 
随机推荐
- JAVA数组的toString()方法不能直接输出数组内容?
			问题描述:我定义了一个类,类名是Job,当我输出Job.toString()是可以按我重载的toString方法输出的,但是如果输出jobs[]这个数组时,只会输出[Lmodel.Job;@45e22 ... 
- 20150722---点击按钮使指定的控件可见部分平移(JS)
			前段代码: <div id="out" style=" width:400px;overflow:hidden;"> <div id=&quo ... 
- jmeter之cookies登录
			现在很多网站的登录都要验证码了,验证码的值是动态的,值不易获取.使用jmeter测试一个需要登录的接口就有困难,这时候,我们就可以使用cookies管理器来记住这个登录信息. 目录 1.jmeter的 ... 
- Vagrant 手册之网络 - 公共网络 public network
			原文地址 Vagrantfile 配置文件中公共网络的标识符:public_network,例如: config.vm.network "public_network" Vagra ... 
- jdk (Java Development Kit)
			JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具. JD ... 
- mooc-IDEA 调试代码--012
			mooc-IDEA 调试代码 添加断点快捷键:ctrl+F8 单步运行:F9 <=>resum(从一个断点跳转到下一个断点) 一行一行运行:F8 查看所有断点: 禁止所有断点: 条件断点 ... 
- ELK日志分析系统之Kibana7.x最新版安装与配置
			3.Kibana的简介 Kibana 让您能够自由地选择如何呈现自己的数据.Kibana 核心产品搭载了一批经典功能:柱状图.线状图.饼图.旭日图等等. 3.1.软件包下载地址:https://www ... 
- Python模块之pdfkit
			1.安装依赖 pip install python-docx #Python下的Microsoft Word 2007工具 pip install PyPDF2 #Python下的PDF工具 pip ... 
- jvm(1)性能监控-linux相关命令
			top命令能够实时显示系统中各个进程的资源占用情况,其输出信息分为两部分,前半部分为系统统计信息,后半部分是进程信息. 第一行是任务队列信息,它的结果等同于uptime命令. 第二行是进程统计信息: ... 
- linux php 中session 多站点共享session问题
			linux php 中session默认file 假如修改为redis php.ini session.save_handler = "files"; session.save_p ... 
