动态规划
呆呆的人v
这个作者很懒,什么都没留下…
展开
-
poj 3211 Washing Clothes(0/1背…
题意:有n(1~10)种不同颜色的衣服总共m(1~100)件,Dearboy和她的girlfriend两个人要一起洗完全部衣服,两个人洗衣速度相同,并且已知每件衣服需要的时间<1000)。两个人可以同时洗衣。为了预防色彩混合,必须一种颜色的衣服洗完之后,两个人才能开工洗下一种颜色的衣服,问两个人洗完所有的衣服需要的最短时间。思路:每种颜色的衣服可以分开来考虑,算出每种颜色的衣服所需要的原创 2013-04-23 09:25:49 · 445 阅读 · 0 评论 -
poj 2250 Compromise(DP)
题意 : 找出两个text 中 最长的公共子串 有多组测试数据思路:经典的LCS问题,只是把字母改成了字符串而已//228K 0MS#include #include #define M 105chars1[M][35],s2[M][35]; //s1记录text1的每个word s2 记录text2的每个wordcharans[M][35];原创 2013-04-23 09:26:21 · 477 阅读 · 0 评论 -
poj 2663 Tri Tiling(DP)
题意:给你一个3*n的框框,用2*1的dominoe去填满 问一共有多少种不同的方法以;思路:我不知道这题算是DP呢还是找公式f[i] = f[i-2]*4 - f[i-4] i>= 4;#include int main (){ int n,f[31]= {1,0,3,0,11}; for (int i =4;i f[i] = f[i -原创 2013-04-23 09:26:23 · 430 阅读 · 0 评论 -
HDU 2546 饭卡(01背包)
思路:典型的01背包问题,题目说,只有饭卡的钱大于等于5 才能买,所以先求出 m-5能买到的最多的钱数,再弄最后的钱去买最贵的,此时卡上的余额肯定是最少的。//46MS 232K#include #include #include #define M 1005using namespace std;int f[M],val[M];int max (int a ,int原创 2013-04-23 09:27:16 · 447 阅读 · 0 评论 -
poj 3267 The Cow Lexicon(DP)
题意:有一长为L的message 和W个word in the dictionary 。要求去除message中的某些字符使其由theword of the dictionary 组成 (当然,要求是去掉最少的)原文地址:http://blog.csdn.net/lyy289065406/article/details/6648121思路:dp[i]表示从message中第i个字符开原创 2013-04-23 09:25:40 · 407 阅读 · 0 评论 -
poj 3624 Charm Bracelet(0/1背包)
题意:就是给出的N种 Charm Bracelet 使 在不超过M的情况下,val 最大思路:基础的0/1背包模型//212K 250MS#include #include #define M 13500int max (int a,int b){ return a> b? a: b;}int main (){ intdp[M]; int原创 2013-04-23 09:25:47 · 475 阅读 · 0 评论 -
poj 2392 Space Elevator(多重背包…
题意:cow 想要在太空搭电梯,每一种block有它的高度hi和最高不能超过多高ai 每种block有一定的数量ci求能搭建的高大高度思路:多重背包。 只是有一点小变形 把block按它的的ai从小到大排序,从小的开始搭建 因为如果从大的开始,就有可能把小的给忽略掉用dp[] 记录状态 能否达到这个高度 然后在每次比较时 选出当前能达到的最大高度//332K 172MS#inc原创 2013-04-23 09:25:56 · 398 阅读 · 0 评论 -
poj 1609 Tiling Up Blocks(DP)
题意:Michael The Kid有n块积木,每块积木左上有l个凸口,右上有w个凸口,左下右l个凹口,右下有w个凹口。当l>= l'并且m >=m'时,木块'可安装于另一个上面。问最高能叠几层积木。思路:这个问题可以转化求最长非递增子序列 以l 降序(l相同 m降序)排列//228K 47MS#include #include #include #define M 1原创 2013-04-23 09:26:19 · 418 阅读 · 0 评论 -
hdoj 4310 Hero (状态压缩DP)
题意:需要杀死n个英雄,怎么使自己的受到伤害最小。对面每个英雄有攻击力(DPS)和血量(HP),回合制,你每次可以打一个英雄,打掉一滴血。对方每回合所以存活的英雄都会攻击你,你掉的血量等于攻击你的英雄攻击力之和。思路:比赛时没做出来,因为没学状态压缩 但发现大家都用贪心给过了 。。。以dps/hp 排序,先干掉hp小的,dps大的另一种就是官方的状态压缩DP :用dp[mask]表示杀死m原创 2013-04-23 09:26:43 · 456 阅读 · 0 评论 -
HDU 2159 FATE(二维背包)
思路:典型的二维背包题,第一次做,所以贴个代码#include #include #define M 105int f[M][M],a[M],b[M];int n,m,k,s;int max (int a ,int b){ return a> b ? a : b;}int dp (){ for (int rm= 1; rm for原创 2013-04-23 09:27:18 · 494 阅读 · 0 评论 -
poj 1014 Dividing(多重背包)
题意:有很多的 marble 每种 marble有一个val 1 ...6 。问给否把它们分成两份,使得两份的val相同。思路:多重背包 算出总的val的一半,如果dp[val]==val/2 那就能dividing//1844K 0MS#include #include #define Max 430000const int n = 6;int dp[Max];in原创 2013-04-23 09:25:58 · 359 阅读 · 0 评论 -
poj 1276 Cash Machine(多重背包…
题意:有一个CashMachine,里面装有n种面值为n[i]的货币,每种有v[i]张。问在所换金额不超过cash元钱的情况下,所能换取的最大金额。思路:原版多重背包模版,直接用就行,不理解的看一多重背包的讲解(很详细)//556K 47MS#include #include #define M 100010#define N 15int dp[M],count[N]原创 2013-04-23 09:25:53 · 442 阅读 · 0 评论 -
poj 2184 Cow Exhibition(0/1背包…
题意:cow要在N头牛中选出几头,始它们的Ts 和Tf 的和最大,但 Ts和Tf不能为负数思路:0/1背包的变形 把s[]当成背包中的费用,f[]当成价值求解,这题的范围是从-1000 到1000 但数组的下标没有负的 所以加上1000 ,还0/1背包中最重要的一点是每件物品只能放一次,而保证这的是它循环的顺序 是从V--->cost 但这是有负值 那就得由cost ---> V 为什原创 2013-04-23 09:26:10 · 518 阅读 · 0 评论 -
poj 2241 The Tower of Babylon(DP…
题意:有N种不同尺过的block(矩形) 每一种数量无限,可以任意旋转 也就是说 x y z 其中可任意两个为底,另一个为高。问你最多能堆多高,要求上面的block要严格的小于下面block的底 即xj < xi&& yj 思路:动态规划 虽说每种block数量无限,但其实最多只能用三块。对全部的block 排序 x 降序 x相同 y 降序。这样就能转换成最大非增递子序列。//172原创 2013-04-23 09:26:39 · 475 阅读 · 0 评论 -
poj 2441 Arrange the Bulls(状态…
题意:有N头牛,每头牛都有自己喜欢的barn 而且一个barn只能有一头牛,求给这些牛分配barn 共有多少种方法思路:状态压缩DP,先说一下状态方程dp[i][j] 表示第i头牛在j的状态下的方法数 dp[i][j] =sigma(dp[i-1][k] ) k 从0 到 1<<(m-1);这里用到滚到数组 因为dp[20][1<<20]的数组会MLE。//8384K 407M原创 2013-04-23 09:26:45 · 458 阅读 · 0 评论 -
HDU 4341 Gold miner(分组背包)
题意:一个人在原点(0,0)抓金子,每块金子有一个价值v和获得需要的时间t。如果金子在一条直线上,那只能先抓近的,再抓远的。求在给定时间T下,所能获得的最大价值。思路:分组背包问题。把在同一直线上的点划分为同一个组,因为分组背包问题每个组只能选一件或不选,所以要对原先的每个点进行处理,把同一组中,后面的点的t和v的值等于它前面所有点的和这样,选了它就一定选择了它前面的点了 剩下就是分组背包原创 2013-04-23 09:27:14 · 505 阅读 · 0 评论 -
poj 3254 Corn Fields(状态压缩DP…
题意:在一个N*M的玉米地里,FJ想在种些草养牛,但有些土地是不肥沃的,不能种(1表示能种,0为不能)而且相邻不能种草(即两块草场不能有共公边) 求有多少种种法思路:状态压缩DP dp[i][j] 表示第i行,第sj状态下的方法个数,可得出状态方程 dp[i][j] =sigma(dp[i-1][k]);//168K 0MS#include #include #define原创 2013-04-23 09:26:41 · 483 阅读 · 0 评论 -
poj 3342 Party at Hali-Bula (树…
题意:n个人形成一个关系树,每个节点代表一个人,节点的根表示这个人的唯一的直接上司,只有根没有上司。要求选取一部分人出来,使得每2个人之间不能有直接的上下级的关系,求最多能选多少个人出来,并且求出获得最大人数的选人方案是否唯一。思路:第一道树状DP,不太会,是按解题报告的思路写的。地址:http://wenku.baidu.com/view/aee323cd0508763231121252原创 2013-04-23 09:26:53 · 496 阅读 · 0 评论 -
poj 1463 Strategic game(树状DP…
题意:有N个点,每两个点至多只有一条边,如果在一个结点上放一个士兵,那他能看守与之相连的边,问最少放多少个兵能,把所有的点能看守住。思路:题中已明确表示 为一棵树,所以想到了用树状DP,状态方程:dp[root][1] +=dp[leaf][0]; //根结点放一兵的话,等于 它所有叶结点所须最少兵的和dp[root][0] +=dp[leaf][1]; //根结点不原创 2013-04-23 09:26:55 · 535 阅读 · 0 评论 -
poj 1958 Strange Towers of Hanoi…
题意:四个柱子的汉诺塔 A B C D 开始A上有N个disk 全部移到D上最少的步数思路: 首先你得明白三个柱子的汉诺塔 n个disk从A 到 C的最少步数 F(n) = 2^n-1;那四个呢?? 其实题目已经告诉我们解法了 At first k >= 1 disks on towerA are fixed and the remaining n-k disks are moved原创 2013-04-23 09:25:31 · 403 阅读 · 0 评论 -
poj 1159 Palindrome(DP 空间压缩…
思路见前一文,上一种做法中,内存差一点就超了,改进了一下,因为求LCS时,只用到了表的两行,所以可以进行空间压缩//196K 797MS#include #include #define M 5002short int c[2][M];char s1[M],s2[M];int Max (int a,int b){ return a> b ? a : b;}in原创 2013-04-23 09:25:38 · 403 阅读 · 0 评论 -
poj 1837 Balance (01背包)(转)
题目大意:有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。其中可以把天枰看做一个以x轴0点作为平衡点的横轴输入:2 4 //C 钩子数 与 G钩码数-2 3 //负数:左边的钩子距离天平中央的距离;正数:右边的钩子距离天平中央的距离c[k]3 4 5 8 //G个重物的质量w[i] dp思路:每向天平中方一个重原创 2013-04-23 09:25:51 · 408 阅读 · 0 评论 -
uva 674 - Coin Change(dp)
题意:给一个钱数n,有5种硬币,求有多少种组合方法。思路:记忆化搜索。很容易想到状态转移方程:f[i] = sum(f[i-coin[j]),但是有一个问题,一维的无法解决,因为会有重复,比如如f[11] = f[10]+f[6]+f[1] , 而f[10] 和 f[6]里包含 1 511111、 5 111111 重复。所以用二维表示,避免重复。//0 KB 42原创 2013-05-03 22:31:00 · 1052 阅读 · 0 评论