传送门

区间DP简介:

  在写这题前,需要先弄清楚区间DP是如何操作的:

  区间DP的做法还是相对固定的,没有其他类型DP的复杂多变。主要思想就是先在小区间进行DP得到最优解,然后再利用小区间的最优解合并求大区间的最优解。实现起来也十分简单,即枚举区间长度,再枚举左端点,之后枚举区间的断点进行转移。(不同的题目,有不同的转移方式)。

  下面给出区间DP最简单形式的伪代码(具体要根据题目修改)

//mst(dp,0) 初始化DP数组
for(int i=;i<=n;i++)
{
dp[i][i]=初始值
}
for(int len=;len<=n;len++) //区间长度
for(int i=;i<=n;i++) //枚举起点
{
int j=i+len-; //区间终点
if(j>n) break; //越界结束
for(int k=i;k<j;k++) //枚举分割点,构造状态转移方程
{
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+][j]+w[i][j]);
}
}

题解:

  区间dp的套路:设 f [ i ] [ j ] 为区间释放 i ~ j 号囚犯所需最少的肉(注意, i , j 不是牢房编号,是释放的囚犯编号,也就是下面的 a [ i ] 数组)

  枚举区间的分界点 k ,转移方程为:

    f [ i ] [ j ] =min { f [ i ] [ j ] , f [ i ] [ k-1 ] + f [ k+1 ] [ j ] + a [ j+1 ] - a [ i-1 ] -1 -1 }

  把后面这一块拿出来拆开看看, f [ i ] [ k-1 ] + f [ k+1 ] [ j ] + a [ j+1 ] - a [ i-1 ] -1 -1

    f [ i ] [ k-1 ] + f [ k+1 ] [ j ],这个不必解释

  a [ j+1 ] - a [ i-1 ] -1就是第 j+1 个要放出的囚犯到第 i-1 个要放出的囚犯之间的人数,也就是要发的肉的数量;

  最后一个 -1 是什么呢,就是第k个放出去的囚犯,不用给他吃肉了

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<stack>
#include<queue>
#include<deque>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 2501
int n,m;
int a[maxn];
int f[maxn][maxn];
inline int read()
{
char kr=;
char ls;
for(;ls>''||ls<'';kr=ls,ls=getchar());
int xs=;
for(;ls>=''&&ls<='';ls=getchar())
{
xs=xs*+ls-;
}
if(kr=='-') xs=-xs;
return xs;
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{
a[i]=read();
}
sort(a+,a+m+);//排序,有序的才能转移状态
a[]=;a[m+]=n+;//假设0和n+1号牢房有人,方便后面的状态转移(我就因为没有初始化输出负数)
for(int l=;l<=m;l++)//枚举区间长度
for(int i=;i+l-<=m;i++)//区间左端点位置
{
int j=i+l-;//区间右端点位置
f[i][j]=INF;
for(int k=i;k<=j;k++)//枚举分界点
f[i][j]=min(f[i][j],f[i][k-]+f[k+][j]+a[j+]-a[i-]--);
//状态转移
}
printf("%d\n",f[][m]);//输出
return ;
}

P1622 释放囚犯的更多相关文章

  1. P1622释放囚犯

    这是一道绿题,是一道让人想用贪心但却是区间DP的题目,难倒了我这个蒟蒻. 这个题其实仔细观察是类似于石子合并的!合并石子的代价便是肉的数量,求最小代价.所以我们设dp[i][j]为释放第i个到第j个所 ...

  2. luogu P1622 释放囚犯

    题目描述 Caima王国中有一个奇怪的监狱,这个监狱一共有P个牢房,这些牢房一字排开,第i个紧挨着第i+1个(最后一个除外).现在正好牢房是满的. 上级下发了一个释放名单,要求每天释放名单上的一个人. ...

  3. 洛谷P1622 释放囚犯

    题目描述 Caima王国中有一个奇怪的监狱,这个监狱一共有P个牢房,这些牢房一字排开,第i个紧挨着第i+1个(最后一个除外).现在正好牢房是满的. 上级下发了一个释放名单,要求每天释放名单上的一个人. ...

  4. 洛谷P1622释放囚犯

    题目: 这个题很明显是一个区间DP,但是比较不同的是,这个题它很像区间DP的经典题——石子合并. 然后我傻傻的搞了这个题搞了一下午,然后几乎看遍了全网的题解,就只看懂了这个方法,可能是我太菜了吧,但是 ...

  5. 【区间DP】释放囚犯

    貌似和石子合并差不多 可能是我见的题太少了,所以都差不多 OK 算法分析 首先不难看出这是一道区间DP,那么,按照本蒟蒻的意思 区间DP==三个循环 for(int len=2;len<=n;l ...

  6. 贿赂囚犯 Bribe the prisoners ( 动态规划+剪枝)

    一个监狱里有P个并排着的牢房,从左往右一次编号为1,2,-,P.最初所有牢房里面都住着一个囚犯.现在要释放一些囚犯.如果释放某个牢房里的囚犯,必须要贿赂两边所有的囚犯一个金币,直到监狱的两端或者空牢房 ...

  7. 【网易官方】极客战记(codecombat)攻略-地牢-囚犯

    关卡连接: https://codecombat.163.com/play/level/the-prisoner 解放囚犯,你会得到盟友. 简介 敬请期待! 默认代码 # 释放囚犯,击败守卫并夺取宝石 ...

  8. DP の 百题大过关(5/100)

      动态规划自古以来是DALAO凌虐萌新的分水岭,但有些OIer认为并没有这么重要--会打暴力,大不了记忆化.但是其实,动态规划学得好不好,可以彰显出一个OIerOIer的基本素养--能否富有逻辑地思 ...

  9. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

随机推荐

  1. Selenium 常用定位对象元素的方法

    常见定位对象元素的方法 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方 ...

  2. CXF+Spring+Hibernate实现RESTful webservice服务端实例

    1.RESTful API接口定义 /* * Copyright 2016-2017 WitPool.org All Rights Reserved. * * You may not use this ...

  3. 合并两个JsonArray

    //合并两个JSONArray public static String joinJSONArray(JSONArray mData, JSONArray array) { StringBuffer ...

  4. mycat的下载和安装

    1.下载. 网址:http://dl.mycat.io/ 2.安装. 解压:tar zxf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz ...

  5. 保存canvas

    http://www.crazybunqnq.com/2018/09/01/PythonSeleniumSaveCanvas/ http://www.webhek.com/post/save-canv ...

  6. logstash 5.1.1 学习

    Logstash 5.1.1 安装配置 安装和配置 java 环境: [root@ ~]# tar xf jdk-8u71-linux-x64.tar.gz [root@ ~]# mv jdk1.8. ...

  7. Leetcode480-Sliding Window Median

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  8. Vue小案例 之 商品管理------创建页面与部分数据

    logo的路径: 页面的初始布局: 初始的HTML: <div id="container"> <!--logo title--> <div clas ...

  9. python简说(十)json模块

    常用模块: 一个python文件就是一个模块 1.标准模块,python自带的 2.第三方模块,需要安装 3.自己写的python文件 json,就是一个字符串 1.json转为字典 json_str ...

  10. DDos攻击的常见方法及防御方法

    什么是DDoS? DDoS是英文Distributed Denial of Service的缩写,意即“分布式拒绝服务”,那么什么又是拒绝服务(Denial of Service)呢?可以这么理解,凡 ...