DP
文章平均质量分 68
Non_Cease
这个作者很懒,什么都没留下…
展开
-
poj1163 动态规划 水题
题目本身很简单,开始用一个一维数组来做,只需确定一下每个数左下方和右下方的数的位置即可,测试数据通过,但是提交老是runtime error, 加大数组空间还是这个错误。。。没办法,开了二维数组,直接就A了,郁闷。#include using namespace std原创 2011-09-24 16:50:31 · 776 阅读 · 0 评论 -
poj1170 状态压缩
因为每种物品最多五个,总共五种物品,所以可以将状态存为6进制的整数。先对每一种special offer进行dp, 转移方程为 dp[ i + offfer[k].stt ] = MIN( dp[ i + offer[k].stt , dp[ i ] + offer[k].prc ), 当然状态转移前,要进行判断是否可转移,若当前状态下 的某种物品数量加上当前的special offer原创 2011-10-20 22:22:40 · 1303 阅读 · 0 评论 -
poj1745 Divisibility
题意:给你一列整数,在整数间加‘ + ’ 或 ‘ - ‘,使这个算式的值能被k整除。用dp[ i ][ j ] 表示加上或减去第 i 个数后,所得值取模后的值能否为 j ,所以dp为bool型即可。状态转移方程:dp[ i ][ abs( j + num[i]) % k] = true; dp[ i ][ abs( j - num[i]原创 2011-10-22 09:54:07 · 1339 阅读 · 0 评论 -
poj1322 Chocolate
题意:包里有无穷多个巧克力,巧克力有c种颜色,每次从包里拿出不同颜色巧克力的概率都是相等的,桌面的巧克力不允许颜色相同,若某次拿出的巧克力与桌上的巧克力颜色相同了,则将两颗巧克力都吃掉。计算进行n次拿巧克力的操作后,桌上有m颗巧克力的概率,输出结果精确到小数点后三位。用dp[ i ][ j ] 表示进行 i 次操作后桌面上有 j 颗巧克力的概率,状态转移方程:dp[ i ][ j ] += d原创 2011-10-21 21:18:49 · 2153 阅读 · 0 评论 -
poj1661 Help Jimmy
题意就不描述了。将Jimmy开始下落的地方也看成一个平台,平台的左右坐标相同;为了便于处理,把地面也看成了一个平台。用dp[ i ][ 0 ]表示到达第 i 个平台左边的最少时间,dp[ i ][ 1 ] 表示到达第 i 个平台右边的最少时间。状态转移方程:从第 i 个平台左边到第 j 个平台左边:dp[ j ][ 0 ] = MIN( dp[ j ][ 0 ], dp[ i ][原创 2011-10-21 13:23:40 · 618 阅读 · 0 评论 -
poj1837 Balance
背包:一杆秤,称上有n个秤盘,左边的秤盘到称中央的距离为负,右边为正,有m个物品,放在称上使称平衡,有多少种放法,至少存在一种。dp[ i ][ j ] 表示放了第 i 个物品后力矩值为 j 的方法种数。#include using namespace std;#define M 21#define V 7600int dp[M][V];int h[M], w[M];in原创 2011-10-24 18:12:41 · 724 阅读 · 0 评论 -
poj2151 dp求概率
题意:有T个人参加比赛,共有M道题,第 i 个人通过第 j 题的概率为 p[i][j]求:所有人都至少做出一道题,而且第一名至少做出N道,求这个结果的概率分析:可以知道,每个人自己是互不影响的 对于一个选手 i 前 j 道题,做出 k 道题的概率F[i][j][k] = F[i][j - 1][k - 1] * p[i][j] + F[i][j - 1][k] * (1 - p[i][j]原创 2012-02-24 21:17:31 · 712 阅读 · 0 评论 -
poj3267 dp
题意:给定字符串msg,再给定W个单词,要求从s中去掉最少的字符后能够被这些单词表示。求最少去掉多少字符。用d[ i ]表示从msg[ 0...i ]中最少去掉字符的个数, remove [ j, k ] 表示msg[ j ... k ] 中包含了某个单词后去掉的字符个数。状态转移方程就为 d[ i ] = min ( d[ j - 1] + remove[ j, i ] ),0 i。原创 2012-02-27 20:50:36 · 1795 阅读 · 1 评论 -
poj1260 dp
注意一点:如果第 i 种珍珠用第 j 种珍珠代替得到最优解, 那么第 i+1~ j - 1种珍珠都应该由第 j 种珍珠代替。证明:由已知可得第 j 种珍珠一定会买,所以第 i+1~ j - 1种珍珠由 j 以后的珍珠代替不能得到最优,若第 i+1~ j - 1种珍珠 不由第 j 种代替,那么在第 i+1~ j - 1种珍珠之间必定要买至少一种珍珠 k,那么将第 i原创 2012-02-27 22:46:09 · 606 阅读 · 0 评论 -
poj1080
和最长公共子序列(LCS)相同,dp[ i ][ j ] 表示g1[ 1...i ]与g2[ 1...j ]的最大相似度,那么dp[ i + 1][ j + 1]就为dp[i][j] + score[g1[i+1]][g2[j+1]]、dp[i+1][j] + score['-'][g2[j+1]]、dp[i][j+1] + score[g1[i+1]]['-']三者的最大值。所以状态转移原创 2012-02-29 21:20:41 · 1030 阅读 · 0 评论 -
poj3176 简单dp
就是一个数塔,可以用一维数组节省空间。状态转移方程:dp[i][j] = a[i][j] + max( dp[i+1][j], dp[i+1][j+1])#include #include using namespace std;#define M 355short a[M][M];int dp[M], n;inline int max(short a, short b)原创 2012-02-29 21:26:24 · 1753 阅读 · 0 评论 -
poj2533 简单DP LIS
最长上升子序列(LIS)dp[ i ]以序列中第i个元素结尾的最长上升子序列的长度那么状态转移方程为:if (a[i] > a[j]) dp[i] = MAX (dp[i], dp[j] + 1);#include #include using namespace std;#define MAX(a,b) a>b?a:bint a[1005], dp[1005], n;原创 2012-02-29 21:32:04 · 3176 阅读 · 0 评论 -
poj1463 树形dp
题意:一城堡的所有的道路形成一个n个节点的树,如果在一个节点上放上一个士兵,那么和这个节点相连的边 就会被看守住,问把所有边看守住最少需要放多少士兵。 dproot[ i ]表示以i为根的子树,在i上放置一个士兵,看守住整个子树需要多少士兵。 all[ i ]表示看守住整个以i为根的子树需要多少士兵。 状态转移方程: 叶子节点:dp原创 2012-04-08 20:06:13 · 1473 阅读 · 0 评论 -
poj2750 线段树+动态规划
问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和。出题者的简单解题报告:把环从一个地方,切断拉成一条直线,用线段树记录当前区间的非空最大子列和当前区间的非空最小子列。如果环上的数都是正整数,答案是:环上数的总和-根结点的非空最小子列;否则,答案是:max{根结点的非空最大子列,环上数的总和-根结点的非空最小子列},每次问答的复杂度是O(logN)。原创 2012-04-08 14:34:37 · 2312 阅读 · 0 评论 -
hdu 2955 动态规划 01背包
题意:Roy要偷银行,每个银行都有一个被抓到的概率,Roy的妈妈算出一个不被抓到的概率上限,要求求出Roy偷到最多的钱且不超过被抓到的概率上限。正难则反, 状态转移方程则为 dp[ v ] = max( dp[ v - w[ i ] ] * p[ i ] , dp[ v ] ) , dp[ v ] 表示偷到 v 元逃脱的概率, w[ i ] 表示从第 i 个银行能偷到的钱, p[ i ]原创 2011-09-24 13:13:00 · 655 阅读 · 0 评论 -
poj1157 LITTLE SHOP OF FLOWERS (dp)
题意:用n种花按顺序放入m个花瓶中,m个花瓶是固定的,编号为1~n的话必须按编号由小到大的顺序放入花瓶且都必须放入花瓶,每种花放入不同的花瓶得到不同的审美价值,编程求最大审美价值。用dp[ i ][ j ] 表示前 i 种花放入前 j 个花瓶中得到的最大审美价值,所以状态原创 2011-10-19 13:12:52 · 472 阅读 · 0 评论 -
决斗 dp, spoj196 Musketeers
题目来源:6th Polish Olympiad in Informatics, stage 1题目连接:http://www.spoj.pl/problems/MUSKET/(找了很久才找到的,这成了我在spoj上的第一道题)黑书上的例题 p117页#inc原创 2011-10-10 10:53:40 · 972 阅读 · 0 评论 -
hdu 1864 动态规划 01背包
题意大家都看得懂,需要注意两点:1.报销的只有A、B、C三种类型,要是出现D、E、F.....之类的,这张发票是不能报销的。2.一张发票上,同种类型的物品加起来大于600,这张发票就是不能报销的,而不是一定要单件物品大于600。 #include using n原创 2011-09-24 10:22:23 · 798 阅读 · 0 评论 -
poj1014 Dividing 动态规划 多重背包问题
第一次写多重背包的题,竟然1A,我真的十分地感动,哈哈。题意:Marsha 和 Bill 收集了一些弹珠,弹珠因为大小和花纹不同,有不同的价值,他们想把弹珠分成价值相同的两份,这样对两个人才公平, 问是否能够分成这样的两份。#include us原创 2011-09-25 17:34:25 · 1499 阅读 · 0 评论 -
poj1088 dp+记忆化搜索
就是求最长下降序列,就是深搜并记录矩阵中每个地方的最长降序列。状态转移方程为: dp[ i ][ j ] = MAX( dp[ i - 1 ][ j ] , dp[ i + 1 ][ j ], dp[ i ][ j - 1], dp[ i ][ j + 1] ) + 1;原创 2011-09-25 23:41:41 · 511 阅读 · 0 评论 -
poj1191 棋盘分割(记忆化搜索)
中文题意,大家都明白。《算法艺术与信息学竞赛》的116页有讲解,先将方差公式化简,最终确定只需求切割n-1次后n块矩形中每块矩形的总分的平方的和最小。设这个平方和为res,最终的答案就为res/n-avrg^2开根号。#include #include using原创 2011-09-27 22:34:13 · 2231 阅读 · 0 评论 -
poj2817 状态dp(二进制存储)+记忆化搜索
http://www.cnblogs.com/PureMilk/archive/2008/07/17/1245085.html#2163586 思想参考的这位的博客,写得很详细,十分感谢她(他),这也是我的第一道状态dp,代码是自己敲的,开始的时候,过不了样例,发现位运算原创 2011-09-29 20:22:47 · 1035 阅读 · 0 评论 -
poj1185 状态dp
题意:略。代码中有些简短注释。#include using namespace std;int dp[105][65][65]; //dp[i][k][j]存储的值为当第i-1行为k状态,第i行为j状态时可放炮兵的最大数量int state[65], sum[65原创 2011-09-30 18:00:57 · 570 阅读 · 0 评论 -
NOI1029 积木游戏(dp)
题目链接:http://judge.noi.cn/problem?id=1029#include #include using namespace std;#define MAX(a, b) a<b?b:a#define M 102#define N 4int原创 2011-10-10 19:17:46 · 1047 阅读 · 0 评论 -
poj1390 方块消除 dp
参考:徐源盛《对一类动态规划问题的研究》以及刘汝佳的黑书《算法艺术与信息学竞赛》将方块序列,按颜色分成一段一段的,例如 1 1 1 1 1 3 2 2 1 1 1 可记为color[ 1 ] = 1; len[1 ] = 5; color[ 2 ] = 3; len[ 2 ]原创 2011-10-13 00:05:39 · 2530 阅读 · 1 评论 -
poj1141 括号序列 dp
本题难在输出括号序列,dp是比较简单的dp[ i ][ j ] 存储 i~j 这段括号序列需要添加的括号数,决策有两种,对dp[ i ][ j ], (1).若i 与j 是匹配的,只需将i+1~j-1这段变成合理的括号序列; (2).取i~j原创 2011-10-13 14:49:44 · 1955 阅读 · 0 评论 -
poj1458 dp Common Subsequence
#include using namespace std;#define MAX(a, b) a>b?a:b#define M 251char s1[M], s2[M];int dp[2][M]; //滚动数组int main(){ int i, j, l1原创 2011-10-15 21:24:56 · 456 阅读 · 0 评论 -
poj1276 多重背包
多重背包,套的1014的模板,链接http://blog.csdn.net/non_cease/article/details/6820068#include using namespace std;#define MAX(a, b) a>b?a:b#define N原创 2011-10-15 22:48:53 · 794 阅读 · 0 评论 -
poj1159 Palindrome (dp)
两种方法:1.序列 i~j为回文,两种策略: (1)若str[ i ] == str[ j ], 则只需要 i+1~j-1 为回文, 此时:dp[ i ][ j ] = dp[ i+1 ][ j-1 ]; (2)否则只需要在 str[ j ]后加 1 个字原创 2011-10-15 14:42:30 · 607 阅读 · 0 评论 -
poj1036 Gangsters
题意:N个歹徒去一个餐馆,旅馆门有k个打开程度(每个打开程度为门的一个状态),每个歹徒拥有自己的肥胖度(两个歹徒的肥胖度可能相同)和繁荣度(prosperity),歹徒在i 时刻到餐厅来(两个歹徒可能同时来餐馆),若此时刻门的打开程度与歹徒的肥胖度相同,则歹徒就进入餐馆,同时餐馆原创 2011-10-17 19:23:31 · 2648 阅读 · 4 评论 -
poj1050 To the Max (dp)
题意:求一个n*n矩阵的子矩阵,使得这个子矩阵中的数字之和最大。(1)首先考虑一个整数列,dp[ i ]表示以第 i 个 整数结尾的一列连续整数获得的最大值,那么,显然,第 i-1 个数是否在这列数中,只需判断以第 i-1 个数结尾的一列连续的数最大值是否大于0,即 dp[原创 2011-10-18 21:36:17 · 419 阅读 · 0 评论 -
poj1836
题意:士兵拍成一行,让最少的士兵出列,使得每个士兵都能看到至少一个最边上的士兵(中间某个人能看到最边上的士兵的条件是该士兵的身高一定强大于他某一边所有人的身高),身高序列可以是这样:1 2 3 4 5 4 3 2 1 或者 1 2 3 4 5 5 4 3 2 1本题不是难题,但是细节处理是很恼火的(个人觉得),例如处理第二种原创 2011-10-24 15:17:53 · 1990 阅读 · 0 评论