题意:

一个监狱里有P个并排着的牢房。从左至右依次编号为1,2,...,P。最初所有的牢房里都住着一个囚犯。相邻的两个牢房之间可以互通信息。

现在要释放一些囚犯。如果释放某个牢房里的囚犯,其相邻的牢房里的囚犯就会知道,因而发生暴动。所以,释放某个囚犯时,必须要贿赂两旁相邻牢房的囚犯一枚金币。另外,为了防止释放的消息在相邻牢房间传开,不仅两旁直接相邻的牢房,所有可能听到消息的囚犯,即直到空牢房为止或直到监狱两端为止,此间的所有囚犯都必须给一枚金币。

现在要释放Q名囚犯。如果选择所需金币数量尽量少的顺序释放,最少需要多少枚金币?

释放的Q名囚犯,显然会将整个区间分成许多小区间,以此为思路,我们用dp[i][j]表示:将从a[i]号囚犯到a[j]号囚犯(不含两端的囚犯)的连续部分里的所有囚犯都释放时,所需的最少金币总数。

为了更方便的处理两端的情况,我们把左端当成0号囚犯,右端当成Q + 1号囚犯。这样,dp[0][Q + 1]就是答案。

代码:

#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 10000 + 10;
const int INF = 10000000;  int P, Q, a[maxn];    //A中保存输入数据,下标从1开始
int dp[maxn][maxn];   //dp[i][j] := 释放(i, j)所需的金币
int main()
{  int T;  scanf("%d", &T);  for (int cas = 1; cas <= T; cas++){  scanf("%d%d", &P, &Q);  for (int i = 1; i <= Q; i++){  scanf("%d", &a[i]);  }  //为了方便,将两端加入a中  a[0] = 0;  a[Q + 1] = P + 1;  //初始化  for (int q = 0; q < Q; q++){  dp[q][q + 1] = 0;  }  //从短的区间开始填充dp  for (int w = 2; w <= Q + 1; w++){  for (int i = 0; i + w <= Q + 1; i++){  //计算dp[i][j]  int j = i + w, t = INF;  //枚举最初释放的囚犯,计算最小的费用  for (int k = i + 1; k < j; k++){  t = min(t, dp[i][k] + dp[k][j]);  }  //最初的释放还需要与所释放囚犯无关的a[j] - a[i] - 1 - 1枚金币  dp[i][j] = t + a[j] - a[i] - 1 - 1;  }  }  printf("Case #%d: %d\n", cas, dp[0][Q + 1]);  }  return 0;
}

Bribe the Prisoners(GCJ 2009 Round 1C C)(dp)相关推荐

  1. Bribe the Prisoners——GCJ 2009 Round1C C(区间dp)

    题目:P个并排的牢房(1,2,3....P).每个牢房一个囚犯.现在要释放其中的Q个囚犯.每释放一个囚犯,就得向左给每一个相邻囚犯一枚金币,直到遇到空牢房.向右也是如此.问以什么样的顺序释放所花费的金 ...

  2. 与我们的书合影——在2009北京国际图书展(BIBF)

    2009年9月5日,武汉博文编辑许莹.夏青观看了于国展旧馆(静安庄)举行的2009北京国际图书展(BIBF)"专业场".在电子工业出版社展台,编辑兴奋地与我们的几本畅销书(< ...

  3. 刷题: bribe the prisoners(2009 Round 1C C)

    题目描述 In a kingdom there are prison cells (numbered 1 to P) built to form a straight line segment. Ce ...

  4. 2009年工作总结(三)

    经历了前面了毕业设计.论文撰写及毕业答辩.可以说自己的学校生涯已经告以段落.告别了自由自在的学习环境.跟无私奉献的导师.教授们说声离别,跟最真挚的同学道声珍重.走出校门就意味着自己再也享受不了学生的所 ...

  5. Bribe the Prisoners(2009 Round 1C C)

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

  6. 2009 Round 1C C Bribe the Prisoners

    题目可以在网上找,这里主要讲思路 这是一个最优子,即最优解可以由子问题的最优解得到.主要思路在下面 注意:(1)dp[i][j]表示的是,将从A[i]号囚犯到A[j]号囚犯(不含两端的囚犯)的连续部分 ...

  7. Codeforces Beta Round #1--C题(多边形求最小面积)

    题目: http://codeforces.com/contest/1/problem/C 题意:给你一个正凸多边形的三个点,然后求出这个正凸多边形的面积的最小值. 方法是这样的:以这三个点做一个三角 ...

  8. Codeforces Round #321 (Div. 2) D Kefa and Dishes(dp)

    用spfa,和dp是一样的.转移只和最后一个吃的dish和吃了哪些有关. 把松弛改成变长.因为是DAG,所以一定没环.操作最多有84934656,514ms跑过,实际远远没这么多. 脑补过一下费用流, ...

  9. Microsoft Dynamics AX 2009 新增功能 – 应用(目录)

    PDF 下载链接 第 1 章:新增常规功能 用户界面更新 角色中心 工作流 Contoso 演示数据集 第 2 章:财务 填充实用程序 过帐限制 原因代码 自动分摊 – 总帐 冲销分录 – 总帐 预算 ...

最新文章

  1. HB限时领Deponia: The Complete Journey
  2. Windows 之 删除文件出现“该项目不在请确认该项目的位置”
  3. Jquery 禁用浏览器的 后退和前进按钮
  4. 数据3分钟丨CSDN 1024程序员节来啦!PostgreSQL 14和openGauss 2.1.0在同一天正式发布。...
  5. html根据菜单角色配置菜单代码,CSS设置列表样式和创建导航菜单实现代码
  6. redis mysql 事务_Mysql与Redis事务
  7. 【读书笔记】深入分析Java Web技术内幕-Cookie与Session
  8. datagridview滚动条自动滚动_一个自适应滚动条的实现
  9. 函数式编程(一) 认识“编程范式”和“函数”
  10. 有效解决vue动态绑定多个class的官方实例语法无效的问题
  11. [Gamma阶段]第四次Scrum Meeting
  12. CentOS安装jdk
  13. ORK FrameWork - 自定义存储数据ISaveData接口
  14. matlab计算积和式,定积分计算方法总结
  15. 5G无线技术基础自学系列 | 5G基站形态演进
  16. App测试查看日志(详细)
  17. 乔治亚大学计算机科学,乔治亚大学的计算机科学排名,真得稳重考察
  18. Transact-SQL(T-SQL)编程
  19. linux 路径 冒号_收藏 | Linux常用实用命令
  20. 【Web技术】1005- 关于 JS 与 CSS 是否阻塞 DOM 的渲染和解析

热门文章

  1. 应用宝发布apk问题
  2. 怎么删除桌面上多余的ie浏览器图标?
  3. duilib编译错误解决方法整理 (含VS2013)
  4. 如何看待字节跳动取消大小周普遍降薪?平均每日入账6.5亿,11万员工怎么办
  5. C++:默认成员函数和this指针
  6. 某腾讯程序员,在深圳月薪6w,然而却要被断供了?是如何一步步走向破产边缘?...
  7. 2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp
  8. SP3267 DQUERY - D-query【莫队】或【主席树】
  9. 【转载】Android微信智能心跳方案
  10. 听云监控.NET Core的配置误区