gcj2009R1C_C(区间dp)
来源:互联网 发布:我的世界me网络怎么摆 编辑:程序博客网 时间:2024/05/22 04:24
/*translation:总共有p个犯人,其中要释放q个。但是释放一个犯人必须给两排直接相邻的牢房的犯人一枚金币。直到空牢房为止,或者监狱的两端。求q个犯人全部释放最少需要多少金币?solution:区间dpdp[i][j]表示释放i+1~j-1的犯人需要多少金币。dp[i][j] = 此时所需金币数量 + 释放右侧部分需要的金币 + 释放左侧部分需要的金币note:注意循环的边界,区间dp的题目如果需要在两端设置一个值用来处理两端的情况时,此时dp[i][j]表示的是一个开区间,所以这时候的边界处理特别容易出错,要注意!!date:2016.9.6*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 105;const int INF = 1e30;int p, q, a[maxn];//监狱犯人总个数,释放犯人个数,释放犯人的编号int dp[maxn][maxn];int main(){freopen("C-large-practice.in", "r", stdin);freopen("C-large-practice.out", "w", stdout); int T, kase = 0; scanf("%d", &T); while(T--) {scanf("%d%d", &p, &q);for(int i = 1; i <= q; i++)scanf("%d", &a[i]);a[0] = 0;a[q + 1] = p + 1;q += 2;memset(dp, 0, sizeof(dp));for(int gap = 2; gap < q; gap++) {for(int i = 0; i + gap < q; i++) {int j = i + gap, t = INF;for(int k = i + 1; k < j; k++)t = min(t, dp[i][k] + dp[k][j]);dp[i][j] = t + a[j] - a[i] - 2;}}printf("Case #%d: %d\n", ++kase, dp[0][q - 1]); } return 0;}
0 0
- gcj2009R1C_C(区间dp)
- hdu4597(区间dp)
- poj1651 (区间dp)
- hdu4283(区间DP)
- poj2955(区间DP)
- poj1141(区间DP)
- hdu2476(区间DP)
- poj1651(区间DP)
- lightoj1422(区间DP)
- zoj3469(区间DP)
- hdu4745(区间DP)
- NYOJ304(区间DP)
- hdu5115(区间dp)
- poj2955(区间dp)
- poj1651(区间dp)
- hdu2476(区间dp)
- Brackets(区间DP)
- Running(区间DP)
- oracle(-)子查询的应用
- Paxos算法详解与Zookeeper分析
- PAT:最长公共子序列
- 如何在Unity中使用Fmod Studio?
- 移植u-boot学习笔记4-----修改代码之建新板_时钟
- gcj2009R1C_C(区间dp)
- 【a703】求逆序对(线段树的解法)
- 深入理解Android系统的“服务“
- wr703n刷openwrt智能控制--控制mysql、串口通信等
- C#控制台基础 处理一个存进文件路径的字符串获得文件所在的文件夹的路径
- 继承
- python中获取python版本号的方法
- k-th number(主席树 )
- 哈理工OJ 1315 火影忍者之~大战之后(贪心算法)