ACM-动态规划
文章平均质量分 63
Flynn_curry
这个作者很懒,什么都没留下…
展开
-
hdu1059 Dividing(多重背包+二进制优化)
#include #include #include #include using namespace std;const int N = 100005;int sum;int dp[N];void ZeroOnePack(int cost, int weight){ for(int i = sum; i >= cost; i --) dp[i]原创 2016-03-29 22:16:21 · 459 阅读 · 0 评论 -
hdu1058 Humble Numbers && hdu3199 Hamming Problem(简单dp)
以前用优先队列和set做过丑数,这种题也可以用dp。先是1058,这种dp用一层for就可以了,思路很清晰,根据已有的生成未知的。输出格式注意11、12、13的情况是100的余数,这点很操蛋,英语序数词没学好。#include #include #include #include #include using namespace std;const int N原创 2016-04-07 17:47:20 · 366 阅读 · 0 评论 -
poj1185 炮兵阵地(状态压缩dp)
这题。。。换成3维后,果断更不好做了啊首先说说为什么换成三维,dp数组有个特点,由前一个状态才能得到下一个状态,这样做的前提就是必须要保存前面状态的下标,而这个要兼顾前两行状态,所以由二维变为三维。变为三维后,就有个建模的过程。三维建模有两种,假设高为h,一种是直接立方体,另一种是h个矩形,这个题还是用立方体想比较好。然后是数组的大小,这里有人说top为60,这个60怎么来原创 2016-04-12 21:49:27 · 428 阅读 · 0 评论 -
hdu4539 郑厂长系列故事——排兵布阵(状压dp)
和炮兵阵地如出一辙,但还是半天才改出来,麻烦就麻烦在测试数据不好找,错也不知道错哪了。。。#include #include #include #include using namespace std;const int N = 200;const int INF = 1e8;const int mod = 100000000;int n, m, top, total;原创 2016-04-13 20:32:06 · 450 阅读 · 0 评论 -
poj3524 Corn Fields(状态压缩dp)
#include #include #include using namespace std;const int N = 4500;const int INF = 1e8;const int mod = 100000000;int n, m, top, total;int state[N], cur[20], dp[20][N];bool ok(int x){原创 2016-04-09 20:40:53 · 365 阅读 · 0 评论 -
hdu3652 B-number(数位dp)
省赛原创 2016-04-22 22:15:23 · 437 阅读 · 0 评论 -
hdu3709 Balanced Number(数位dp)
00原创 2016-04-24 08:37:32 · 322 阅读 · 0 评论 -
hdu1074 Doing Homework(状压dp)
把每个作业的写与不写看成二进制的一位,字典序大的放前面,这样输出的时候按照递归从后往前输出。但凡输出前驱貌似都要用到递归。dp数组存放的是最小得分,t数组存放的是最小花费的时间,先遍历所有可行状态,再遍历所有课程。想通了感觉还好,可是这题第一感觉想到的是贪心,而且状态压缩看的别人还想好久,泪#include #include #include using namespa原创 2016-04-17 13:25:54 · 348 阅读 · 0 评论 -
hdu4722 Good Numbers(数位dp)
前驱原创 2016-04-24 10:05:43 · 297 阅读 · 0 评论 -
hdu1501 Zipper(dfs && dp)
挺不错的题。第一反应是模拟字符串匹配,但第二个样例就否定了。str1 = cat, str2 = tree, str = catrtee,当主串匹配到第四个字符t时,问题来了,是匹配第一个的还是第二个的?模拟的话两个判断条件会有个顺序,但一旦有顺序就会导致其中一种匹配不成功,所以换思路。一种是简单的深搜,一种是简单的dp,思路都很清晰。dfs:#include原创 2016-04-17 16:06:55 · 874 阅读 · 0 评论 -
hdu4734 F(x)(数位dp)
按时吃原创 2016-04-24 21:23:30 · 316 阅读 · 0 评论 -
hdu3555 Bomb(数位dp)
啊啊原创 2016-04-22 22:14:58 · 290 阅读 · 0 评论 -
hdu2089 不要62(数位dp两种做法)
用几天的空余时间看了数位dp,其实光论思想还是比较简单的。这题可以用暴力打表做,但是1000000的数据并不适用于所有题,太容易超时了。数位dp先初始化一个二维dp数组,行数代表该数要处理多少位,最高位放在最下面, 该行中每一项代表取0~9中的所有数后该属性数的数量。其中列数中dp[i][0]代表加上当前最高位后吉利数的数量,dp[i][2]代表加上当前最高位为2的情况下吉利数的数原创 2016-04-22 22:14:42 · 421 阅读 · 0 评论 -
hdu5902 GCD is Funny(错) && hdu5904 LCIS(最长公共连续上升子序列)
ps:好久没打比赛,第一道题刚开始想复杂了,听队友意见后恍然大悟果断暴力,虽然A掉,但是后来出题人又把已经A掉的给消除了。原来是题意理解错了,这题还要用到容斥原理,好吧我还没看容斥,果然这题没这么简单,就先不要脸的把这错题贴上来好了= =,轻喷。。#include #include #include #include #include using namespace s原创 2016-05-14 10:05:32 · 342 阅读 · 0 评论 -
hdu2546 饭卡(01背包水)
注意题上说的是大于等于5元就能随便买,那就用这5元买了最贵物品,然后就是个以价值为容量的背包。注意这题和寒冰王座类似,都是大材小用的可暴力背包。#include #include #include using namespace std;const int N = 1005;int main(){ // freopen("in.txt", "r", stdin);原创 2016-02-29 19:54:32 · 360 阅读 · 0 评论 -
hdu1203 I NEED A OFFER!(01背包)
这题是求概率,所以dp求的是不被录取的概率,记住以后但凡出来概率题都要反向思考。剩余的钱越少,不被录取的概率越小,录取率越大,所以最后求的就是dp[n]。话说每次做这题脑子里都要翻一个大弯,真是醉了。注意初始化的时候不能用memset初始化,只能把n逐个初始化,我也不知道为啥。。。反正编译不出来。还有一点,题中输出的是两数同为0时才跳出,因为这破条件我还WA了4原创 2016-04-06 21:51:32 · 279 阅读 · 0 评论 -
hdu2955 Robberies(01背包)
这题我是看题解做的。。。刚开始一看浮点数遍历,乘100后再算果断WA(和我想的一样)。然后就不会了,看了才知道要转化背包,而且这个概率算的话是相乘,求的是最大逃跑概率,真是从头错到尾啊。。。还有Mi的范围是100题上说的啊,结果运行错误,果断改大就好= =。还是没完全理解01背包啊。。。ps:最近应该是到了瓶颈期,看一道一道不会,做题速度大减不说,还浪费好多时间。听了12首原创 2016-03-21 22:18:04 · 5649 阅读 · 5 评论 -
hdu2079 选课时间(题目已修改,注意读题)(多重背包)
本题刚开始一看求方案数,当场懵逼,现在求的背包都是最大容量,这题还能叫背包么?(我也不造)一看小数据,二进制也不用优化(其实是不会这半背包类型)。然后判断其背包是否装满,装满就要分开初始化。这题看别人题解说是要判重,其实就是在遍历物品数量前加了个条件,如果超了背包容量就退出。还有值得注意的地方,最后遍历的才是背包数量,因为是通过遍历同一种物品数量来判断是否装满,而对于容量题目要求必须为原创 2016-03-30 21:36:19 · 2654 阅读 · 1 评论 -
hdu2844 Coins(多重背包)
#include #include #include #include #include using namespace std;const int N = 500005;int dp[N], bag[N], val[N];int sum;void ZeroOnePack(int cost, int weight){ for(int i = sum; i >= c原创 2016-03-30 22:11:56 · 349 阅读 · 0 评论 -
hdu1171 Big Event in HDU(多重背包)
这题相当于是hdu1059的弱化版。但是数据量却比我想象的要大。#include #include #include #include #include using namespace std;const int N = 100005;int dp[N], bag[N], val[N];int sum;void ZeroOnePack(int cost, int wei原创 2016-04-03 09:46:28 · 341 阅读 · 0 评论 -
hdu1248 寒冰王座(完全背包)
本题可以用完全背包做,但感觉背包就是大材小用。背包是指不同大小和价值的物品放入固定容量背包所得的最大价值,注意有两个变量。而本题只是衡量价值。为一个变量,所以暴力也可以。暴力法:#include #include #include using namespace std;const int N = 1005;int main(){ // freopen("in.tx原创 2016-02-13 20:32:31 · 456 阅读 · 0 评论 -
hdu1284 钱币兑换问题(完全背包)
好吧,应该是求方案数也算是背包的一类型题吧。值得注意的是,求背包容量问的是最优解,所以用max调用放与不放两个状态。而方案数不同,他来自两个方向的和。拿本题来说,是上一层元素(前驱方案数,代表不放)+本层元素(当前方案数,代表放),递归方式比较经典。当然也可以优化。懒得优化了= =#include #include #include #include #include u原创 2016-04-03 14:31:47 · 1200 阅读 · 0 评论 -
hdu1421 搬寝室(普通DP)
DP这东西真的是很难想啊!排序什么的不难,问题是对子问题的理解。又是看的别人的T T。。。dp[n][k]代表有n行k列,相当于从n个物品中选k对。题目要求是求k对的最小值,可问题是刚开始的我怎么也没办法在脑海中模拟DP的这个过程。模拟不出来就没办法敲,出了错也就没法改。说白了,DP就是高级模拟嘛!555.。。状态方程不能凭空想出来一切都白搭。状态方程:当j * 2 ==原创 2016-04-04 15:22:18 · 330 阅读 · 0 评论 -
hdu1864 最大报销额(01背包)
好吧,这题又因为找不到错看题解了。。。居然因为dp不是全局变量半天无法编译,还因为一个breakWA了无数次,心情简直糟透了。。。#include #include #include #include #include using namespace std;const int N = 3000050;int dp[N];int main(){ //原创 2016-03-22 19:27:39 · 347 阅读 · 0 评论 -
poj3624 Charm Bracelet(01背包)
好歹是自己做的01背包,纪念下= =#include #include #include #include #include using namespace std;const int N = 50005;int dp[N], vol[N], val[N];int main(){ // freopen("in.txt", "r", stdin); int原创 2016-03-22 20:24:53 · 429 阅读 · 0 评论 -
hdu2159 FATE(二维完全背包)
5555居然因为memset写成sizeofWA了半天而没被察觉,为毛自己的错误这么明显却发现不了呢还是参考的别人= =。首先要知道每种怪数量不限,所以用完全背包处理。主要就是理解不了二维究竟体现在哪里,因为三维太难处理,所以用滚动数组改成了2维。背包内存储的是经验,所以两个背包容量分别是杀怪数和忍耐值。至于怪的种类用于最外层对滚动数组的刷新吧。求最大剩余忍耐值,再以经验值为条件对忍耐原创 2016-04-05 15:56:27 · 811 阅读 · 0 评论 -
hdu3591 The trouble of Xiaoqian(多重背包 + 完全背包)
这题。。。敲完都快和人家的代码一模一样了。真的,这题对于现在的我来说只能是学习T T虽然做过好多基本背包,但两个背包放一起对我来讲就完全不一样了,还是自己弱啊。。。这个题解真的不错有几个注意的地方:1、所买物品价值最大10000,但其并不是背包容量。因为我们的dp1代表的是小茜所付的钱,其实和物品价格没关系,而是她的最大消费值20000。同理dp1和dp2大小就应该开到2000原创 2016-04-05 22:00:36 · 685 阅读 · 0 评论 -
hdu1257 最少拦截系统(最长上升子序列)
本题就是给你一个无序序列(依次飞来的高度),让你动态规划这个序列。#include #include #include #include using namespace std;const int N = 5005;const int INF = 1<<27;int main(){ // freopen("in.txt", "r", stdin); int原创 2016-02-07 08:39:01 · 395 阅读 · 0 评论 -
poj1458 Common Subsequence(最长公共子序列)
复习最长公共子序列。而且事实证明,边界必须要初始化,还不能是全部都变为0,我也不知道为毛。。。而且要想初始化边界,输入时必须要往后挪一位。#include #include #include #include #include using namespace std;const int N = 1005;const int INF = 1000005;int dp[N][原创 2016-03-23 22:11:41 · 356 阅读 · 0 评论 -
hdu1423 Greatest Common Increasing Subsequence(最长递增公共子序列)
LCIS其实就是LCS的一个变种。把a[i]作为被匹配串(代表n行),b[i]作为匹配串(代表n列),则要想成为递增匹配,每行的关系必须满足升序。这样DP时只需要比较上下的关系即可。从而DP到每一列的底部,找出最大匹配数即可。下面是LCS的直接改进:#include #include #include using namespace std;const int N = 50原创 2016-02-20 14:17:42 · 380 阅读 · 0 评论 -
poj2127 Greatest Common Increasing Subsequence(LICS+路径)
5555校赛在即可是这路径输出我怎么也搞不好,搞了好久了,改天在搞吧。。。#include #include #include #include #include using namespace std;const int N = 1005;const int INF = 1000005;int dp[N][N], path[N][N];int main(){原创 2016-03-25 20:09:40 · 568 阅读 · 0 评论