转载请注明出处:http://blog.csdn.net/Lizo_Is_Me/article/details/43735509

问题描述:

一个监狱里有P个并排着的牢房,从左往右一次编号为1,2,…,P。最初所有牢房里面都住着一个囚犯。现在要释放一些囚犯。如果释放某个牢房里的囚犯,必须要贿赂两边所有的囚犯一个金币,直到监狱的两端或者空牢房为止。现在要释放a1,a2,...,aQa_1,a_2,...,a_Q号囚犯,如何选择释放的顺序,使得使用的金币最少。

思路:

其中很重要的一点:释放了某个囚犯以后,就把连续的牢房分成了没有任何关系的两段。
只要枚举出所有的释放囚犯的顺序即可,复杂度为 O(Q3)O(Q^3)。

利用动态规划枚举所有的情况的时候,我们有2种方法:
方法1.(自上而下)先选取首先释放的囚犯。然后划分没两段独立的部分,然后对左右两段再递归的调用。
方法2.(自下而上)利用动态规划数组,例举出所有最小的子问题,然后再根据最小的子问题可以组合成稍大一点的子问题。

用二叉树的来表示可能更形象一点:
针对每个释放顺序,都可以用一个二叉树来表示
例如:有 1-8个囚犯,释放顺序为:4,2,6的话
1、先释放4

2、释放2

3、释放6

可以看出,当释放4号的时候,就把原先的1-8号分为1-3号和5-8号两段独立的,所以上面的第二步和第三步其实可以交换的,
当然这个例子比较简单,不过其实再复杂的问题也就是上面的这些情况的不断叠加而已,比如上面这个二叉树也可能是更大的二叉树的一个部分。

然后我们再回过来,用二叉树的表示方法来再来说一下上面的2个方法,可能方法1比较容易理解,人的一般思维方式都是这样的,然后重点说说方法2
方法2的思想是:
例如要释放 a1,a2,...,aQa_1,a_2,...,a_Q囚犯,我们记为A[1]-A[Q],先分成最小的区间开始找,为了方便,我们把两端也加入,这样变为A[0]-A[Q+1]
什么叫最小的区间?就是在区间里面只有一个要释放的囚犯,这样的区间(长度为2)是 A[0]−A[2],A[1]−A[3]..A[Q−1]−A[Q+1]A[0]-A[2],A[1]-A[3]..A[Q-1]-A[Q+1],求出其对应的金币,我们记为Cost[0][2],Cost[1][3]...Cost[Q−1][Q+1]Cost[0][2],Cost[1][3]...Cost[Q-1][Q+1]
然后我们再找区间里面只有两个要释放的囚犯,这样区间(长度为3)可以用上面长度为2的区间来求得 例如 A[0]-A[3]
如果先释放1号,对应的是Cost[1][3]Cost[1][3]加上a0与a1a_0与a_1之间的囚犯数
如果先释放2号,对应的是Cost[0][2]Cost[0][2]加上a2与a3a_2与a_3之间的囚犯数
然后Cost[0][3]就是上面值更小的一个情况
这样不断迭代,最后就可以求出Cost[0][Q+1],就是最后的答案

枚举的时候,由于可能会出现多次相同的情况,但前面又已经计算过了,所以可以利用一个数组,来保存已经计算过的情况(剪枝)。

代码实现

//区间动态规划
//bribe the prisoner
//定义一个二维数组。依次用来填充最小的花费。
int dp[max+1][max+1];
cost[i][j]//表示从第i个填充到j个时的最小花费。
//同时定义一个存放罪犯的数组。
int a[i];
void solve()
{a[0]=0;a[Q+1]=Q+1;//为了解决边界问题。for(i=0;i<=Q;i++)cost[i][i+1]=0;//初始化,因为所有的从i到i+1的花费除去边界都是0;//循环求解。定义w表示区间的范围,w=2表示跨度为2的情况,也就是该区间里面只有一个要释放的犯人for(w=2;w<=Q+1;w++){//每次选的范围都是w,从i到j 的范围内的最小值等于从i到K加从第k到j的最小值。for(i=0;i<=Q+1;i++){//此处用到的k恰是其中的中值。int j=i+w,tmp=INT_MAX;//tmp用来保存当前区间的当前最好情况的花费金币数for(k=i+1;k<j;k++)tmp=min(tmp,dp[i][k]+dp[k][j]);cost[i][j]=tmp+a[j]-a[i]-2;//此处就是当前区间最小值。}}
}

这种思想和最优二叉查找树的算法是一样的。所以懂了这个思路再去看最有二叉树相信也能一下就理解

编程题-贿赂囚犯(Bribe the prisoners)-动态规划|剪枝相关推荐

  1. 贿赂囚犯 Bribe the prisoners (动态规划)

    问题描述: Problem In a kingdom there are prison cells (numbered 1 to P) built to form a straight line se ...

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

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

  3. 贿赂囚犯 Bribe the prisoners DP

    对于i到j之间我们要去除第k个人. 我们需要i-k之间所有的花费 加上  k-j之间所有的花费  加上 当前需要的花费 前面两部分花费我们dp早就求出了 当前需要的花费 我们是对于当前i到j这一部分, ...

  4. Bribe the Prisoners SPOJ - GCJ1C09C

    滴答滴答---题目链接 贿赂囚犯 Bribe the prisoners ( 动态规划+剪枝) Problem In a kingdom there are prison cells (numbere ...

  5. 股票交易日(动态规划)----美团2016研发工程师编程题(二)

    [编程题] 股票交易日 在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行).给出一天中的股票变化序列,请写一个程序计算 ...

  6. Bribe the Prisoners 菜鸟的记录

    Bribe the Prisoners 题目大意 有一个监狱里有一排牢房1-P,其中住着一些囚犯.现在要释放一些囚犯Q, 当释放一个囚犯的时候,要给两边所有的囚犯每人一枚金币, 直到遇到空牢房或者尽头 ...

  7. [区间记忆化dp入门][Bribe the Prisoners SPOJ - GCJ1C09C][Codeforces Round #505D (rated, Div. 1 + Div. 2, ba]

    Bribe the Prisoners SPOJ - GCJ1C09C 作为这类题代表,f[i][j]代表第i点到第j点单独处理的最值 这题关键:释放某个囚犯后,就把囚犯分成两段,两段互相独立 这类d ...

  8. MIT微软为AI量身打造了一套leetcode编程题

    丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI 你见过这种编程题目描述方式吗? 不用自然语言描述,也没有输入输出示例,你所看到的就只有一个Python函数. 这是来自MIT.Allen A ...

  9. python算法预测风险等级_一般算法水平到底什么样子才能秒杀Bat的笔试编程题?...

    很简单,打开 LintCode 随便找一道中等难度的题,如果能很快找到思路并提交代码通过,那么BAT公司的笔试编程题基本没什么问题了.(唯一需要注意的是国内公司笔试题目一般都很长,比较考验阅读理解能力 ...

最新文章

  1. CVPR2020:训练多视图三维点云配准
  2. 是男人就下100层【第五层】——2048游戏从源代码到公布市场
  3. GPT-2的大规模部署:AI Dungeon 2 如何支撑百万级用户
  4. java显示时间_Java如何显示日期和时间?
  5. 【Java】异常和IO在Gourmet咖啡系统中的应用
  6. 动态对象泛型数组绑定控件 0107
  7. 七年级认识计算机课件,认识计算机(七年级)ppt课件
  8. 网络编程中使用float型数据要注意
  9. 如何解决Django与Vue语法的冲突
  10. MongoDB自学日记1——基本操作
  11. 华为服务器软件维护,服务器系统软件维护
  12. 五步构建经营指标,拒绝分析不接地气
  13. 图形验证码知识点整理 Object.prototype.toString.call()等
  14. 一键清除系统垃圾文件的bat批处理命令
  15. Apollo_ReferenceLine smoother
  16. 屏幕旋转后字体会变大问题
  17. 如何上手机上不了无线网络连接服务器,手机连接不上路由器无线网络怎么处理...
  18. 【100条企业网站推广方法】
  19. 记录~OPENCV读图失败的三种情况,其中一种情况罕见
  20. 吴恩达机器学习作业1-线性回归讲解版奔雷手

热门文章

  1. 肠道核心菌属-粪球菌属(Coprococcus)
  2. 计算机综合应用实训是什么意思,计算机综合应用能力实训报告.doc
  3. vue中使用指令给按钮添加节流
  4. 郭光灿院士--奇妙的量子世界笔记1(量子世界和经典世界区联系)
  5. 神经网络结构如何确定,神经网络的神经元结构
  6. 云服务器什么是镜像?
  7. DM368开发 -- 文件烧写
  8. 中国经济的长周期走势
  9. 书写我的人生回忆录-这应该是给子女和父母最好的礼物
  10. LeetCode 390. 消除游戏