
Dynamic Programming
文章平均质量分 65
秋水忆秦谣
三更灯火五更鸡,正是男儿读书时。 黑发不知勤学早,白首方悔读书迟。
展开
-
UVa 1401 Remember the Word
Trie+DP大白书上的字典树训练题。题意是说一个字符串可能有多少种小串组成。例如 abcd 4abcdababcd=a+b+cd;abcd=ab+cd;递推为:从最后一位往前,dp[i]=dp[i]+dp[i+ len[x]] x为输入时的顺序,附加到节点中。是 i~strlen(S)的前缀。S[1,2,3,…,i,…len]原创 2014-07-17 15:28:37 · 1297 阅读 · 0 评论 -
UVA 10192 Vacation
DP,也是一样,求LCS。不过用scanf会WA。 gets就AC了。 应该是数据中存在空格或者制表符问题。#include#include#include#include#include#include#include#include#include#include#include#include#define INF 0x7fffffff#d原创 2014-11-06 09:07:59 · 592 阅读 · 0 评论 -
HDU 1028 Ignatius and the Princess III
可以套完全背包。每次累加起来就好了。#include#include#include#include#include#include#include#include#include#include#include#include#define INF 0x7fffffff#define eps 1e-8#define LL long long#define原创 2014-11-04 21:42:44 · 605 阅读 · 0 评论 -
背包的自我修养
大概了解了背包九讲前面四章的内容。先 ORZ DD大神一分钟……59,58,57…………3,2,1。好,结束,总结一下三种背包问题,01,完全,多重。都隶属于动态规划问题。下面这是个人四天来的学习体会。区别方式也很简单:①物品数量只有一个,只存在放和不放的区别,01背包。②物品数量有无限多个,或者能完全把背包装满,完全背包。③物品数量有限而且不能原创 2014-07-11 15:28:09 · 724 阅读 · 0 评论 -
UVA 111 History Grading
DP,题意晦涩难懂。LCS问题。源序列要经过转换。 比如 4 2 1 3. 是指 事件1 发生在第四,事件2 发生在第二,事件3发生在第一 ,事件4发生在 第三。转换后的序列为 : 3 2 4 1 。所以说很丧病。UVA很多题都是一大堆题意。我用的二维数组。其实可以优化 滚动或者一维。#include#include#include#include#原创 2014-11-04 11:48:09 · 736 阅读 · 0 评论 -
UVA 10405 Longest Common Subsequence
DP。还是LCS问题。应该是有空格或者 Tab 。用scanf 就WA了。gets 就AC了。#include#include#include#include#include#include#include#include#include#include#include#include#define INF 0x7fffffff#define eps 1原创 2014-11-04 12:10:45 · 623 阅读 · 0 评论 -
UVA 674 Coin Change
DP,背包的思想。问 最多7489块钱。有多少种组成方式。面额分别为 1,5,10,25,50;由于不限制硬币数量,所以完全背包,累加就可以了。#include#include#include#include#include#include#include#include#include#include#include#include#defi原创 2014-11-04 21:35:20 · 639 阅读 · 0 评论 -
POJ 2250 Compromise (UVA 531)
LCS问题,基础DP。让我很忧伤的WA了很多次。只是一个LCS问题,需要记录一下路径。自己的想办法记录path出错,最后只好用标记。没有什么优化,二维数组,递归打印,cin.eof() 来识别 end of file 标识。至于单词用map 映射的。其实也用不着,直接二维string或者 二维char 然后strcmp 也行。Special Judge原创 2014-11-18 14:17:06 · 750 阅读 · 0 评论 -
UVA 10130 SuperSale
01背包。开始错误的以为是每个物品只能选一次。发现用DP做好难。后来基友把 样例二 所有物品的价值加起来都没有514 。才发现是每个物品 对于每个人只能选一次。不是对于所有人。 所以 就是一个m次的 01背包。然后加起来就是了。#include#include#include#include#include#include#include#include#inc原创 2014-11-13 15:16:57 · 632 阅读 · 0 评论 -
POJ 2241 The Tower of Babylon(UVA 437)
多种方法,我用DP做的。我当成的 最长下降子序列做的。 问了下其他人,有树形DP的,有差分约束用最短路的。还有当作 二维的背包问题的。最长单调子序列,长宽高 x,y,z 分别枚举成六个。然后排序,找最长单调子序列即可。#include#include#include#include#include#include#include#include#include原创 2014-11-27 09:28:59 · 768 阅读 · 0 评论 -
UVA 147 Dollars
跟UVA 674 Coin Change 一样的。完全背包。不过注意的是需要变换一下。把浮点数转换为整形,全部 *20 。coin[]={1,2,4,10,20,40,100,200,400,1000,2000};需要注意的是 int 会溢出,需要long long。格式控制按题意。#include#include#include#include#include原创 2014-11-06 09:48:37 · 627 阅读 · 0 评论 -
第五届蓝桥杯C/C++本科B组(真题试做)(6~8)
终于考完……不过挂科的铁定的了。还是来做题吧。前面八道题做起来都很简单。F:标题:奇怪的分式 上小学的时候,小明经常自己发明新算法。一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼! 对于分子原创 2014-12-31 20:53:26 · 954 阅读 · 0 评论 -
HDU 1505 City Game
题意就是求最大子矩阵。白书上的例题。如果暴力枚举 左上角,然后长和宽。时间复杂度为O(m^3*n^3)。可以定义up[][] 为某个格子最大高度,定义 left[][]为某个格子左扫描最大。定义 right[][]为右扫描的最大。最后乘起来。#include#include#include#include#include#include#include原创 2015-01-18 23:09:55 · 624 阅读 · 0 评论 -
第五届蓝桥杯C/C++本科B组(真题试做)(9~10)
第九题 迷宫取宝标题:地宫取宝 X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。 当小明走到出口时,原创 2015-01-29 17:30:11 · 1173 阅读 · 0 评论 -
UVA 10285 Longest Run on a Snowboard
记忆化搜索,跟以前的做过的 滑雪 一样的。DP+DFS。用dp[][]保存搜索记录,然后满足条件累加即可。#include#include#include#include#include#include#include#include#include#include#include#include#include#define INF 0x7ffffff原创 2014-11-24 11:54:21 · 769 阅读 · 0 评论 -
UVA 10404 Bachet's Game
DP+博弈。m块石子,n种取法。两人看谁取到最后。只需要判断一下dp[i- c[] ] 递推 dp[ i ]。#include#include#include#include#include#include#include#include#include#include#include#include#include#define INF 0x7fffffff原创 2014-11-27 11:45:51 · 771 阅读 · 0 评论 -
UVA 10465 Homer Simpson
DP问题。我当成一个完全背包做的。只有两个物品。用 is[] 判断是否刚好可以装满,不能装满再倒过去找最大。#include#include#include#include#include#include#include#include#include#include#include#include#include#define INF 0x7fff原创 2014-11-24 11:09:11 · 711 阅读 · 0 评论 -
UVA 357 Let Me Count The Ways
跟UVA 674 Coin Change 一样。就是范围变大了而已。不过当结果只有一种可能的时候需要输出 There is only 1 way to produce n cents change.int 会溢出,使用 long long#include#include#include#include#include#include#include#include原创 2014-11-06 10:00:56 · 672 阅读 · 0 评论 -
UVA 10066 The Twin Towers
DP,题目很长,题意就是求LCS。#include#include#include#include#include#include#include#include#include#include#include#include#define INF 0x7fffffff#define eps 1e-8#define LL long long#define PI原创 2014-11-06 08:59:38 · 653 阅读 · 0 评论 -
UVA 624 CD
01背包。 不仅要求出最大的。还要求出最大的由那些构成。多定义一个path[]就可以了。应该是 Special Judge 我样例最后一组输出的是 43 2 sum:45 样例输出的是 4 10 12 9 8 2 sum:45不过也AC了。#include#include#include#include#include#include#inc原创 2014-11-11 14:53:48 · 643 阅读 · 0 评论 -
UVA 562 Dividing coins
01背包。题意是说要把一堆钱分给两个人,尽可能的平均。要求最终两人的差最小。01背包,查看某个价值是否可能达到。能就1,不能就0.#include#include#include#include#include#include#include#include#include#include#include#include#define INF 0x7fffff原创 2014-11-11 10:37:39 · 681 阅读 · 0 评论 -
POJ 2063 Investment
完全背包问题。我的背包训练第二题。按照背包九讲的步骤来搞。题意是说给你一些本钱,然后有一些债券可以购买,不同的债券会有不同的利润,在规定年限内,利润要最大。债券是无限制购买的,(完全背包)获得的利润可以买债券,(背包变大)每年都可以选择债券,也就是每年都要重新开始,(每年一次)最后得出你手上的钱有多少。这道题题目中提示了 1000的倍数。但是本钱原创 2014-07-09 16:04:17 · 955 阅读 · 0 评论 -
POJ 2533 Longest Ordered Subsequence
最长有序子序列。一个DP就好。例如:1 7 3 5 9 4 8;DP数组 分为6次更新。1 7 3 5 9 4 8;0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 1 2 2 3 2 3 4 2 3 2 3 4DP数组为: 0原创 2013-10-26 15:18:37 · 458 阅读 · 0 评论 -
POJ 1088 滑雪 (Vijos 1011)
记忆化搜索。也就是DP+DFS。将搜索过的存下,下次直接使用。不过可能出现很多点被比他大的点保卫。所以每个点都需要算一次。AC代码#include#include#include#includeusing namespace std;int a[501][501];int dp[501][501];int n,m;int xx[]={1,-1,0,0};int y原创 2014-03-30 00:25:42 · 738 阅读 · 0 评论 -
POJ 1742 Coins
多重背包的可行性问题。题意是说 一块表的价格不超过M。你有一些不同数量,也不同面额的硬币。在1-M中你能组成多少种可能。傻逼的理解成组成不超过M的最大价值。ORZ。。。认真读题……时间复杂度 O(M*N)#include#include#includeusing namespace std;int dp[2][100005];int n,m;原创 2014-07-12 22:40:36 · 1154 阅读 · 0 评论 -
集合运算
就是一个a数组。一个b数组。各有n 和 m 个数。0原创 2014-04-04 22:32:10 · 931 阅读 · 0 评论 -
POJ 3624 Charm Bracelet
DP 一直是心中痛,不多说了,这个暑假就坑在这上了。这暑假第一道DP题,01背包问题。题意是说物品有 重量和价值 ,但你能承受的重量有限,问你能带的最大价值。这题数组开大点,虽然不知道有啥坑点,但是我数组开得大,直接1A了。#include#include#include#include#include#include#include#incl原创 2014-07-08 08:59:28 · 780 阅读 · 0 评论 -
POJ 1276 Cash Machine
多重背包问题。题意是给你一个数目的钱,还有一些 不同数量 也不同面额的钞票。问最接近给定 的数目,不能大于。老样子,转换为 01 背包 和完全背包做。不过很神奇的是,给多重背包 用二进制思想转换的时候 用 k#include#include#include#include#include#include#include#include#i原创 2014-07-12 19:49:36 · 772 阅读 · 0 评论 -
HDU 2955 Robberies
01背包问题。题意是说 你要去偷银行,超过某个概率你就会被抓,然后有N个银行。每个银行有一定数量的钱,也有会被抓的概率。算出不会被抓又能偷到的最多的钱。不过很阴险一道题,说得是被抓的概率。你需要算逃跑的概率 然后 (1 - 逃跑的概率)= 被抓的概率。这道题不能用概率去算钱。要用钱来算概率。#include#include原创 2014-07-11 17:03:27 · 592 阅读 · 0 评论 -
Vijos 1104 采药
背包一直是心中的痛。今天一群大神聊天,说递归,DP,图论 是程序员的三道坎。好吧。我现在要跨过第二个。状态转移图。就是把 a[总时间]=max(a[上一个药+这个药]+这个药的价值,a[总时间];AC代码#include#include#includeusing namespace std;int dp[1001];struct lx{ int原创 2014-03-26 22:37:00 · 671 阅读 · 0 评论 -
ZOJ 1232 Adventure of Super Mario
最短路+DP(个人用的SPFA+完全背包)做了一上午……开始想用SPFA+BFS。但是写了半天越写越乱,放弃了。就想到了是不是可以当作背包问题(背出病了……)把鞋子可以使用的次数当作背包容量。做完全背包。先N次SPFA把 各点的最短距离算出来,其实比较适合Floyd。(个人用vector实现伪邻接表,然后SPFA)然后SPFA更新路径的时候,当鞋子使用次数不原创 2014-07-18 10:31:12 · 686 阅读 · 0 评论 -
HDU 1505 City Game
最大子矩阵,(City Game)SEERC 2004,LA 3029白书上的例题,看了两节课,终于理解了。DP的思想。扫描的时候维护 up朝上能有多少空格,left 最多朝左走到多少,right 朝右走到多少。所以只需要扫描一遍即可得出答案 = up*(right-left+1)我定义left数组的时候跟 iostream 冲突了。#inclu原创 2014-09-16 10:53:47 · 748 阅读 · 0 评论 -
POJ 1458 Common Subsequence
其实就是LCS。最长公共子序列。DP入门。2个循环。#include#include#includeusing namespace std;short v[1001][1001];int main(){ char a[1001],b[1001]; int i,j,la,lb; while(~scanf("%s%s",a,b)) {原创 2013-10-25 09:31:59 · 495 阅读 · 0 评论 -
POJ 1252 Euro Efficiency
背包 或者 BFS题意是说给你几种基本货币,组成 1~100 内所有的钱,用最少的基本货币使用量。输出 使用量的概率,和最大的使用量。可以BFS 也可以 背包。不过记得数组开大点。 可能会出现 100 = 99+99 -98 的情况。背包是先做一个完全背包,求得最少可能由多少相加。然后做一个 01背包,看能否被 减。背包:#inclu原创 2014-07-14 12:00:42 · 843 阅读 · 0 评论 -
POJ 2392 Space Elevator
多重背包问题。我的背包训练第三题,多重背包。似乎有点理解多重背包了。我对背包九讲多重背包的理解:当某件物品 体积*数量 超过背包的容积的时候,这就做完全背包(相当于无限取)void completepack(int h,int cost,int a){ for(int i=cost;i<=a;i++) dp[i]=max(d原创 2014-07-11 11:33:10 · 829 阅读 · 0 评论 -
POJ 1014 Dividing
多重背包的可行性问题。题意是说有 1~6 种石头,分别价值1~6 。然后有不同的数量,问你能不能平均分给两个人。这时候可以把价值当作费用,求能不能到达 总价值的一半。即讲背包的容量设为 总价值的一半,能否装满。据说有个很强大的“剪树” 1~6的最小公倍数是60 。个数超过60……if(n&1)n=61; else n=60;ORZ……没想到,也没用这个。原创 2014-07-12 11:37:18 · 651 阅读 · 0 评论 -
POJ 1787 Charlie's Change
多重背包 可行性+路径记录题意是说你要用更多的零钱去买咖啡。最后输出你分别要用的 1,5 ,10 ,25 的钱的数量。多重背包二进制分解,然后记录下 这个状态。最后逆向推即可。#include#include#include#include#include#include#include#include#include#include#inc原创 2014-07-14 09:56:19 · 807 阅读 · 0 评论 -
POJ 1163 The Triangle
就是上到下最大的一条路的值。记得每个点只能选择2条路就行。#include#include#includeusing namespace std;int a[101][101],b[101][101],n;int main(){ while(~scanf("%d",&n)) { int i,j; for(i=1;i<=n;i+原创 2013-10-25 09:42:57 · 502 阅读 · 0 评论 -
HDU 1171 Big Event in HDU
也是多重背包可行性问题。时间复杂度为 O(VN); V=背包容量,N=物品数量。题意是说给你N个物品,每个物品有不同的价值与数量。分给两个院。问你怎么分配才让能让价值尽量相等。跟我上一篇解题报告是一种类型。以价值为费用,总价值的一半为背包容量。不过物品有点多,直接开数组可能会超内存。我就用了滚动数组。需要注意的是 you should guarant原创 2014-07-12 14:47:51 · 677 阅读 · 0 评论 -
UVa 11401 Triangle Counting
题意是说在1,2,3,……,n的序列中选出前n个数。能够组成多少种三角形。白书上的例题。找到递归公式就好了。根据三角不等式,如果三条边为 a,b,c。最大边为c。a+b>c。假设a:1 -> c-1 为止,那么a=1无解,a=2有一个,a=3……,a=c-1 有c-2个解。那么根据等差求和公式得出和。但是需要减去 a==b 的时候,从x/2+1 到 x-1 一共原创 2015-01-20 10:41:56 · 754 阅读 · 0 评论