129_Bribe the Prisoners_DP
2017-05-05 15:11
411 查看
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxq = 100+10;
const int inf = 0x3f3f3f3f;
//待释放囚犯的位置
int a[maxq];
//dp[i][j] 释放第 i 个和第 j 个之间所有囚犯所需金币
//这里的认为把需要释放的囚犯单独提取出来
//也就是说,i j 是 Q 里的序号
int dp[maxq][maxq];
int main ()
{
//P 牢房总数, Q 待释放的囚犯数
int P, Q;
while(~scanf("%d %d", &P, &Q)){
for(int i= 1; i<= Q; i++)
scanf("%d", a+i);
//为了处理方便,将两端加入 Q 中
//此时dp[0][Q+1] 就是答案
a[0] = 0, a[Q+1] = P+1;
//初始化
//其实主要是为了初始化 dp[i][i+1]的值
memset(dp, 0, sizeof(dp));
//从小到达枚举长度
for(int k= 2; k<= Q+1; k++){
//枚举区间起点
for(int i= 0; i+k<= Q+1; i++){
int temp = inf;
//枚举区间内先释放的犯人
for(int j= i+1; j< i+k; j++){
if(temp > dp[i][j] + dp[j][i+k])
temp = dp[i][j] + dp[j][i+k];
}
//释放第一个犯人时要给两边无关的犯人发金币
dp[i][i+k] = temp + a[i+k] - a[i] - 2;
}
}
printf("%d\n", dp[0][Q+1]);
}
return 0;
}
相关文章推荐
- Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)
- 挑战2.7.3 Round 1C 2009 C. Bribe the Prisoners 区间dp
- Bribe the Prisoners——GCJ 2009 Round1C C(区间dp)
- Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)
- DP-记忆化dp--Bribe the Prisoners
- Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)
- Bribe the Prisoners(GCJ 2009 Round 1C C)(dp)
- Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)
- GCJ 2009 Round 1C Bribe the Prisoners
- GCJ1C09C - Bribe the Prisoners
- GCJ1C09C - Bribe the Prisoners
- 记忆化搜搜——Code Jam 2009 Round 1C #C Bribe the Prisoners
- GCJ 2009 Bribe the Prisoners
- GCJ Round 1C 2009 Problem C. Bribe the Prisoners
- [Code Jam] Bribe the Prisoners
- GCJ 2009 Round 1C C (Bribe the Prisoners)
- GCJ--Bribe the Prisoners (2009 Round 1C C)
- 130_Bribe the Prisoners 囚徒贿赂问题 (2009 Round1C C)
- GCJ 2009 Round1C C Bribe the Prisoners
- Bribe the Prisoners(Easy)