这是一道绿题,是一道让人想用贪心但却是区间DP的题目,难倒了我这个蒟蒻。

这个题其实仔细观察是类似于石子合并的!合并石子的代价便是肉的数量,求最小代价。所以我们设dp[i][j]为释放第i个到第j个所花费的代价,先用sum[i]求出每一个节点(犯人1与起点间的人数,犯人i+1与犯人i间的人数,终点与犯人q间的人数,也就是前缀和(还要-1)然后进行区间DP。首先枚举区间的长度,嵌套枚举区间的起点,那么区间的终点便可以得到,然后令dp[i][j]=0xfffffff后枚举分割点,看先释放哪个囚犯更好。于是得出状态转移方程dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]+j-i-1;

1.看到一个题后,想是否万变不离模板题

2.区间DP处理好前缀和或者后缀和,勿漏情况

3.注意第j个与第i个间有j-1-1人

4.状态转移方程写全面,可以代入验证正确性,也别光按照原理判断

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#define N 1005
using namespace std;
int dp[N][N];
int p,q;
int a[N]={},sum[N]={};
int main(){
scanf("%d%d",&p,&q);
for(int i=;i<=q;i++){
scanf("%d",&a[i]);
}
a[]=;
a[++q]=p+;
sort(a,a++q);
for(int i=;i<=q;i++){
sum[i]=a[i]-a[i-]-+sum[i-];//前缀和,代表它前面需要有几个不放给多少个肉
//cout<<sum[i]<<endl;
}
for(int l=;l<=q;l++){//枚举长度
for(int i=;i+l-<=q;i++){//枚举起点
int j=i+l-;
dp[i][j]=0xffffff;
for(int k=i;k<j;k++){//枚举分割点
if(dp[i][j]>dp[i][k]+dp[k+][j]+sum[j]-sum[i-]+j-i-){
dp[i][j]=dp[i][k]+dp[k+][j]+sum[j]-sum[i-]+j-i-;
//j-i-1代表需要释放但还没释放的人的代价
}
}
}
}
printf("%d",dp[][q]);
return ;
}

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

  1. P1622 释放囚犯

    传送门 区间DP简介: 在写这题前,需要先弄清楚区间DP是如何操作的: 区间DP的做法还是相对固定的,没有其他类型DP的复杂多变.主要思想就是先在小区间进行DP得到最优解,然后再利用小区间的最优解合并 ...

  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. R语言-八皇后问题

    老师给我出了个暑期作业:用R语言解决八皇后问题. 八皇后问题:国际象棋棋盘(8×8)上放8个“后”,使8个“后”之间互相不能被进攻.(即:每个“后”所在行.列.两条斜线都没有其它子) 查看网上,大多用 ...

  2. 【NOIP2014模拟11.3】噪音

    题目 FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i]个牛棚.由于奶牛是 ...

  3. python 操作符**与*的用法

  4. git的clone和github的fork

    git的clone是从github上下载下来,clone到项目里面,fork是在本地修改后再提交到github上,在github上用request来进行提交,经作者确认后可以合同到mast分支上

  5. lazarus 线程调试

    lazarus站点的文档中看到的.简单用法: uses  LCLProc; DbgOutThreadLog (msg: string);  overload;  --有好几个不同参数的定义.

  6. 1.端口被占用问题:Embedded servlet container failed to start. Port 8097 was already in use.

    1.端口被占用问题:Embedded servlet container failed to start. Port 8097 was already in use.netstat -anonetst ...

  7. VMWare虚拟机启动不了有个叉叉的解决办法

    打开VMWare虚拟机提示有: This virtual machine appears to be in use. If this virtual machine is already in use ...

  8. sqljob

    http://blog.csdn.net/sinat_16998945/article/details/52586687

  9. anaconda 安装caffe,cntk,theano-未整理

    一,anancona 安装 https://repo.anaconda.com/archive/ conda create -n caffe_gpu -c defaults python=3.6 ca ...

  10. select客户端模型封装——回调方式快速建立客户端

    SockClient.h #pragma once #include<functional> #define _WINDOWS #ifdef _WINDOWS #define _WINSO ...