/*这题终于对了,真是感激涕零,痛苦流涕,这个故事告诉我们:前人的经验果然是有道理的,INF就不要乱设置了,就设0x3f3f3f3f就好当然,还有一个问题就是,不要随便设置long long型,因为每次加法的中间结果,都要加 long long 强制类型转换,以避免溢出,会很烦,而且很容易错,比如我把INF改为 long long型以后,我是真的有去给中间结果,都加上强制类型转换的,该改变数据类型的地方,比如t,和dp数组,我也没有用int定义,而是都改long long了,可是仍然incorrect,就很迷...但是我找了好久也不知道哪里出了问题...*/
#include <iostream>
#include <cstdio>
using namespace std;
const int MAX_Q = 1e4 + 10;
const int INF = 0x3f3f3f3f;
int P, Q, A[MAX_Q + 2]; // A中保存输入数据,下标从1开始// dp[i][j]:= 释放(i, j)所需的金币
//(表示的是,将从A[i]号到A[j]号囚犯(不含两段的囚犯)的连续部分的所有囚犯都释时,所需的最少金币数)
int dp[MAX_Q + 1][MAX_Q + 2];void solve()
{//为了处理方便,将两端加入A中,把左端当作0号囚犯,右端当作 P+1 号囚犯,这样 dp[0][P +1]即为所求//之所以这样加入,是因为定义dp[i][j]时候,对两段的处理,是作为开区间处理的 A[0] =  0;A[Q + 1] = P + 1;for (int i = 0; i <= Q; i++)dp[i][i + 1] = 0;// 从最短的区间开始填充dpfor (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] - 2枚金币dp[i][j] = t + A[j] - A[i] - 2;} cout << dp[0][Q + 1] << endl;
}
int main()
{freopen("E:\\c2.txt", "r", stdin);freopen("E:\\out2.txt", "w", stdout);int k;cin >> k;for (int kase = 1; kase <= k; kase++){cin >> P >> Q;for (int i = 1; i <= Q; i++) cin >> A[i];cout << "Case #" << kase << ": ";solve();}fclose(stdin);fclose(stdout);
}

转载于:https://www.cnblogs.com/mofushaohua/p/7789496.html

GCJ 2009 Round1C C Bribe the Prisoners相关推荐

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

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

  2. Bribe the Prisoners 菜鸟的记录

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

  3. Bribe the Prisoners SPOJ - GCJ1C09C

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

  4. [区间记忆化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 ...

  5. [dp]GCJ 2009 Bribe the Prisoners

    原文 原作者 lizo_is_me 问题描述: 一个监狱里有P个并排着的牢房,从左往右一次编号为1,2,-,P.最初所有牢房里面都住着一个囚犯.现在要释放一些囚犯.如果释放某个牢房里的囚犯,必须要贿赂 ...

  6. GCJ 2009 Bribe the Prisoners

    区间DP--但是细节处理比较多,代码要一些技巧--算水题吧 #include <iostream> #include <cstdio> #include <cstring ...

  7. Bribe the Prisoners(GCJ 2009 Round 1C C)(dp)

    题意: 一个监狱里有P个并排着的牢房.从左至右依次编号为1,2,...,P.最初所有的牢房里都住着一个囚犯.相邻的两个牢房之间可以互通信息. 现在要释放一些囚犯.如果释放某个牢房里的囚犯,其相邻的牢房 ...

  8. 刷题: 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 ...

  9. 挑战2.7.3 Round 1C 2009 C. Bribe the Prisoners 区间dp

    题目链接: https://code.google.com/codejam/contest/189252/dashboard#s=p2 题意: 题解: 区间dp dp[i][j] 表示释放a[i]~a ...

最新文章

  1. python下载指定的版本包
  2. CF#303C Minimum Modular 数学分析
  3. (转载)安全漏洞概念及分类
  4. 计算机可执行指令吧,电脑“开始-运行”的常用命令及用法!很有用!
  5. U3D 通过预置对象实现手动创建精灵
  6. Python学习笔记:面向对象高级编程(完)
  7. JZOJ 5600. 【NOI2018模拟3.26】Arg
  8. python定义一个矩形类_创建矩形类
  9. CodeForces - 976F Minimal k-covering
  10. 斑马无线打印服务器,如何设置斑马打印机无线WiFi
  11. 前端学习(2198):vuex-state单一状态的理解
  12. 剖析Caffe源码之Net(上)---NetParameter参数
  13. Python的模块千奇百怪,居然有自动发短信的模块?
  14. (21)H5之ruby标签
  15. HDU2083 简易版之最短距离【最值】
  16. Hibernate N+1 问题
  17. 巴克莱分析师:今秋新iPhone外观设计与2018年款非常相似
  18. mysql 重做日志_mysql redo log 重做日志
  19. 浅论独立解决问题的能力的重要性
  20. Python串口通信发送浮点型数据

热门文章

  1. webpack 配置简单说几句 ?
  2. 华为S5700交换机开启telnet登录
  3. 初探设计:Java继承何时用?怎么用?
  4. mysql数据库锁定机制
  5. JavaScript 的垃圾回收与内存泄露
  6. Oracle中的备份和恢复之前必须知道的
  7. 利用Cache,asp.net 简单实现定时执行任务
  8. [图示]话剧《被结婚时代》将剩女分4级
  9. TI xDAIS的深入理解
  10. C++实现用堆求最小的k个数