![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM_动态规划
文章平均质量分 63
purevegetable
这个作者很懒,什么都没留下…
展开
-
poj 1141 Brackets Sequence
感想:较好的入门题,关键这里可以让你学到记录路径的方法,也可以算做dp记路径的入门题了吧。思路: 这题的思路关键在于 (A) 或(B) AB这几种请况,所以在dp的过程中 要找这几种的最小值,首先 dp[ i ][ i ]肯定是1,因为只有一个单括号的话,必须要来一个括号来进行匹配; 状态转移方程 dp[ i ][ j ] = min(d原创 2013-07-16 01:41:31 · 1090 阅读 · 0 评论 -
poj 1887 Testing the CATCHER
题目很长,但是题却非常简单,最长递降子序列,是不是感觉无压力啊,那就快AC吧。#include#include#include#define N 1000000#define max(a1,b1) (a1)>(b1)?(a1):(b1)using namespace std;int dp[N],arr[N],n;int main(void){ int k = 1;原创 2013-08-02 18:57:21 · 580 阅读 · 0 评论 -
poj 2181 Jumping Cows
题意:给你一串数字,奇加偶减的计算方法,你求其中一个子串的最大值。思路:简单的DP状态转移方程为:(0为偶,1为奇,dp[i][j]表示到j为止,对应的奇或偶数个数的和的最大值)。dp[1][i] = max(dp[1][i-1],dp[0][i-1]+arr[i]);dp[0][i] = max(dp[0][i-1],dp[1][i-1]-arr[i]);#include#原创 2013-08-05 13:30:12 · 716 阅读 · 0 评论 -
poj 2184 Cow Exhibition
本人推荐的好题,以前写了一题是balance,然后脑筋不行,直接来了个3维的,写到一半直接放弃了。去网上学习了下,这题完全可以转换为2维的,只需要初始化的时将所有的值都编程负无穷。题意:给你n头牛,每头牛都有对应的智商和情商,让你选择一些牛,使得最后情商与智商的和最大(并且2者分别之和都为非负)。思路:肯定是01背包,但是这个维数的转换是必须的,还应注意到这里面的值有正负2种,负的需要从小原创 2013-08-05 16:48:16 · 617 阅读 · 0 评论 -
poj 2033 Alphacode
简单DP,里面是有0的,把0区分清楚就可以A掉了,还有个需要注意的,这个数组开1000会运行错误,最好大点开。题意:1……26表示A到Z,因为11可以有AA和K2种意思,所以要你求给你的这个译码的原文可能有多少种。思路:还是跟上面说的一样,主要是区分这个0的存在和26这个介值。看代码吧,我相信还算是清晰。#include#include#include#define N 50原创 2013-08-05 09:13:02 · 776 阅读 · 0 评论 -
poj 2063 Investment
简单DP,练练手就ok,千万别沉迷其中,嘿嘿。题意:给你一笔钱,叫你去投资,每年的收益又可以拿去继续投,问你n年后你最多有多少钱。思路:那里说的那个所以得bond都是1000的倍数,这个很重要,不然应该会超时的,直接将不足1000的部分用last来存储,因为对投资无用,mon存储现在有多少个1000,然后就是一个纯完全背包问题。dp数组的大小自己可以用计算机算下 1.1^40然后乘上原原创 2013-08-05 09:55:12 · 542 阅读 · 0 评论 -
poj 1952 Buy low, buy lower
最长递减子序列的加强版,本题中序列相同的算是同一种 比如3211,最后一个1就可以不计数。所以这里面还需要特殊判断。 #include#include#include#define N 5001using namespace std;int n,arr[N],dp[N],num[N];int Max(int a1,int b1){ return a1>b1?a1:b原创 2013-08-29 11:53:32 · 742 阅读 · 0 评论 -
poj 1609 Tiling Up Blocks
题意:给你n个积木,每个积木都有4个卡口,上下对称(左上有l个凸口,右上有w个凸口,左下有l个凹口,右下有w个凹口),要想a能安装在a“的上面,则l”>=l且w">=w,其实就是个简单的01背包问题,只是在dp之前需要进行一下排序。 #include#include#include#include#define MAX(a1,b1) (a1)>(b1)?(a1):(b1)usi原创 2013-09-06 10:44:22 · 906 阅读 · 0 评论 -
poj 2151 Check the difficulty of problems
需要一定的概率基础,然后加上一定的dp基础就可以直接解决了,我概率也都忘得差不多了,竟然最后连pn是p1的子问题都分不清了,哎,糊涂啊。 i队做一题的概率非常好求(1减去一道题都没做出来的概率),然后所有队的概率相乘就是每队都至少做出一道题的概率,然后算出至少做出1道题,但不存在一个队做出的题数大于等于N的概率,然后2者相减(pn是p2的子问题),算pn的时候需要用到dp,主要的dp状态转移方原创 2013-09-07 11:13:18 · 664 阅读 · 0 评论 -
poj 3211 Washing Clothes
这题一看给我的感觉就是搜索,对每种的情况进行搜索,找出最接近洗此种颜色衣服花费时间一般(小于等于),然后洗此种衣服的总时间减去搜索的这个结果,就是洗这种衣服需要花费的最少时间。然后按着类别分别进行搜索,然后加起来就是总共需要的时间。看了下别人的思路,发现背包也完全可以实现,并且时间更加短,dp可以避免重复搜索,所以自己写了个do的。#include#include#include#inc原创 2013-09-03 09:45:20 · 700 阅读 · 0 评论 -
poj 1745 Divisibility
此题看听说是dp,然后自己也就只按照dp去想,代码跑了近600ms,算是险过吧。dp的思路,用余数来作为dp的判断条件,因为余数有正有负,所以需要把所有都正值化,即将200作为分界点,然后就是最普通的dp了,其实想到用余数来dp就已经接近解决了。#include#include#includeusing namespace std;const int N = 10001;int原创 2013-09-03 11:24:13 · 619 阅读 · 0 评论 -
poj 2392 Space Elevator
又开始做背包题了,这题典型的多重背包,不过在进行背包处理之前需要先进行一下排序(限制大的在限制小的之前排肯定不合适),不然dp的结果会出现错误。#include#include#include#includeusing namespace std;const int N = 410;struct node{int num, hig, lim;friend bool ope原创 2013-09-17 11:17:04 · 785 阅读 · 0 评论 -
poj 1293 Duty Free Shop
真可谓是wrong了一地, 如果有和我一样的,我可以提供点参考点。我错的地方是, 没考虑到m可以一个都不放进盒子里 比如这组数据1 1052 2 2 2 2这时m一个也不需要,所有的盒子全部用来放l, 所以此时的输出时0, 哎,伤心啊。#include#include#includeusing namespace std;const int Maxn =原创 2014-03-20 19:53:29 · 859 阅读 · 0 评论 -
poj 1276(多重背包)
我的英语差的不只一点点啊,题意看不完全懂,直接看别人的解题报告才把题意弄清(我很菜),但是感觉这题完全就是完全背包基础知识,只要将cost视为与weight完全相等就ok。#include#include#includeusing namespace std;#define N 11int dp[100010];int num[N];int a[N];int V,n;inli原创 2013-05-01 20:39:44 · 848 阅读 · 0 评论 -
POJ 2288 Islands and Bridges
感想:回家休息了半个来月,以前的手感完全没了,这题的思路非常清晰,竟然感觉敲不出来,这段时间恶补吧。 题意:(话说这题的题意还算简单)给你一些岛,然后一个连接岛的桥(无向的),求路径的价值有3种方式,①加上岛的权值 ②加上2岛之间边的权值(2岛权值的乘积) ③连续的3个岛,C1C2C3,如果C1、C3之间有桥进行连接,加上(Vi*Vi+1*Vi+2)。求最大的路径值的个数,正向原创 2013-08-28 16:00:59 · 1233 阅读 · 0 评论 -
hdu 4632 Palindrome subsequence
简单DP,貌似不水的DP自己也做不出来啊,自己又只能刷出2水题啊,网络赛怎么办啊,求大神们赐教啊,努力什么的都有。 题意:给你个字符串,你在里面找有多少种不同的字符串。 注意点:这个MOD的要在里面加上个MOD,不然小心成负值,本人就因为这样wa2次,如果注意到的大神们请别笑我,本人很水。 思路:状态转移方程:if(str[i]==str[ent原创 2013-08-02 15:57:13 · 800 阅读 · 0 评论 -
poj 1953 World Cup Noise
题意:给你n个0或者1,组成0和1的序列,1和1不能相邻,问有多少种不同的排列,相当水的一题,AC吧,加油。状态转移方程: dp[i][1] = dp[i-1][0]; dp[i][0] = dp[i-1][0]+dp[i-1][1];#include#include#include#define max(a1,b1) (a原创 2013-08-02 19:19:30 · 760 阅读 · 0 评论 -
poj 1958 Strange Towers of Hanoi
题意:现在汉诺塔变成4个柱子的,(原本3个柱子的最小步数为 2^n-1),该怎么办啦?原来题目中有解法,(At first k >= 1 disks on towerA are fixed and the remaining n-k disks are moved from tower A totower B using the algorithm for four towers.Then t原创 2013-08-02 19:44:16 · 853 阅读 · 0 评论 -
poj 1636 Prison rearrangement (监狱调整)
感想: 虽然本人也是看别人代码写出来的,但对于我这样的dp菜鸟,实在太有收获了,希望大家无论自己悟出来还是看别人的博客,都争取自己写出来,这题确实对练习dp的人太有益处了。 思路: 一开始就得弄清楚,1号房和2号房是互相联系的,有关系的,他们之间构成一个连通分量(这个必须得弄清楚,不然后面的多重背包完全会想不通的),只要选取其中连通分量中的一个,其余的都要进行交换操作。原创 2013-07-15 11:03:57 · 2512 阅读 · 0 评论 -
poj 1185炮兵阵地
感想:我也才学状态dp,确实逻辑思想得很强,看了半天大神的代码才把思想搞清楚,不说了,我这么搓的智商都A出来了,骚年还等什么啦。思路:应该学过dp的都知道这题得用状态压缩来解决。状态压缩DP。很经典的状态压缩DP。用int型来表示每行的状态(如果int型的二进制的第i位为1,则表示这一行的第i列有安装大炮)。 这样的话由于最多有10列,故由计算可得最多有60种状态。(代码中的ok()函数就原创 2013-07-14 16:18:47 · 798 阅读 · 0 评论 -
POJ 1088 (DP)
感觉没啥技巧,中文题开始都看错了,以为 25-1的距离就是25,现在感觉很不在状态啊, 加油,调整状态。 首先,这题拿到了就感觉得先把结点按照高度(升序)来进行排序,然后在从低高度向高高度前进,这题另外需要注意的就是集中存储结构相互结合,别人怎么做的我不知道,我自己的必须得找出 x,y处高度在前面排序中的rank。来看代码吧。#include#include#include原创 2013-05-10 20:25:22 · 708 阅读 · 0 评论 -
poj 1384 最简单的完全背包
看过背包九讲的基本应该无压力啊,如果没有的话可以call me。直接代码吧#include#include#includeusing namespace std;int p[505];int w[505];int dp[50005];int main(){ int a,b,test; cin >> test; while(test--) { cin>> a >>b;原创 2013-04-27 20:02:56 · 839 阅读 · 0 评论 -
poj 1651
简单的阐述一下题意,就是除了左右2端的数外,从中拿走一个数,然后乘以它临近的左右2个数,然后用sum算其总和,(直到最后只剩下左右2端的数)。 注意:人还是得灵活点的,这个n-1个矩阵的,不要搞成n个矩阵。#include#include#include#define N 101using namespace std;int m[N][N];int p[N];int m原创 2013-04-20 19:55:52 · 835 阅读 · 0 评论 -
poj 3034 Whac-a-Mole
我是被搞郁闷了,一个状态转移方程不知道多早就推出来了,结果就超时了,然后看别人的博客,看到用gcd优化的方法,更改后,我在cmp里面写的 状态转移方程 dp[i][x][y] = max(dp[i][x][y], dp[i-1][x1][y1]+sum); 这个非常简单,但是需要优化的地方很多,代码挺简单的,大家慢慢看吧。如果知道cmp那里那个问题的速度cellme。原创 2013-07-28 16:04:13 · 692 阅读 · 0 评论 -
poj 1157 LITTLE SHOP OF FLOWERS(DP)
题确实有点不好读,就是v个花瓶f朵花,v>=f,每个花瓶只能插一束花,可以有空的花瓶,但是花得插完,然后那个二维数组就是每束花在不同花瓶的价值,题目要求最大的价值和。 不用我说,都知道是DP,dp[i][j] = max{ dp[i-1][i-1....j-1] } + val[i][j];dp[i][j]表示第i朵花插在第j个瓶上的最大价值。附带代码参考。差点忘记了 千万得考虑所原创 2013-05-08 13:23:35 · 683 阅读 · 0 评论 -
POJ 1976 A Mini Locomotive
终于真正的独立思考了一次,哈哈,虽然是最简单的背包01。 代码里面重要部分都有注释。 #include#include#includeusing namespace std;#define N 50100int a[N];int dp[4][N];int b[N];int main(){ int n; cin >> n; whil原创 2013-04-26 21:56:44 · 681 阅读 · 0 评论 -
POJ 1038 Bugs Integrated, Inc.
我靠,一下午加一晚上,还是对着别人的代码,终于看懂了,自己的也A了。 自己能力太差了,大家一起继续努力啊。这是我找到的算是最容易理解的题解了,慢慢看,开始看时是有点苦逼的,加油。思路:把底边贴着第 x 行底边放置的芯片 称为第 x 行芯片。 由于芯片长度只有 3, 所以第 x 行芯片的放置只受 x-1行 和 x-2 行放置情况的影响。 同时由于一旦 方格 (x-1,原创 2013-05-08 21:58:12 · 867 阅读 · 0 评论 -
POJ上的DP题分类。
容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈), 1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958,原创 2013-04-22 13:04:56 · 1289 阅读 · 0 评论 -
poj 3254 Corn Fields
比那个炮兵阵地的题简单点,数据也比较小,可以直接水掉。我在代码中运用了位运算来简化操作。#include#include#include#define N 13#define MOD 100000000#define INF 0x3f3f3f3fusing namespace std;int r,c,tot;int arr[N],suo[400];long long dp[1原创 2013-07-30 17:41:47 · 631 阅读 · 0 评论 -
poj 2411 Mondriaan's Dream
首先注意:最后结果的大小可能超过int型,本人wa了2次,然后也没什么需要注意的了,在想状态转移方程的时候,千万别把当前列和上一列的情况弄混淆了,代码里有注释。#include#include#include#include#define max(a1,b1) (a1)>(b1)?(a1):(b1)using namespace std;int r,c;bool sta[原创 2013-07-31 10:23:51 · 590 阅读 · 0 评论 -
hdu 4628 Pieces
好伤心啊,竟然想出来是状态压缩但写不出来,看来还是题目写得太少了。大致题意:给定一个串,每次可以删除一个回文子串,问把全串删干净的最少次数。 本人反正想了半天也就只有状态压缩能够存储其状态了,状态转移方程 dp[x] = min(dp[x],dp[k]+dp[y] ),(x和y是x的2个子集,且其并集为x),初始化dp[x]时,如果其为回文串,必须初始化为1,因为dp[x]原创 2013-07-31 16:10:04 · 570 阅读 · 0 评论 -
poj 1037 A decorative fence
感想:坑爹啊,是谁告诉我这题是dp水题的,不想吐槽,本想刷刷水题改善下心情的,结果越做心情越糟。 题意:将长度不同的n个木条排列组合。并按照类似字典序的方式对这些组合排序,即长度小的排前面。现在求第m个排列的顺序,并且输出。 思路(转载):通过分析可以知道,木条的具体长度是多少并不重要,只要满足木条之间的长度不相等就可以了。为了简单起见,就设n根木条的长度从小到大依次为1~n。原创 2013-08-02 11:52:28 · 684 阅读 · 0 评论 -
POJ 1160 Post Office
最近做的最水的一道dp题,好开心啊(算了,我承认我是2b青年)。题意:一条公路上有n个村庄,现在需要建造m个邮局,问邮局建造后使得所有的村庄到对应的邮局的路程总和的最小值。思路:很水的,先自己推一下,i个村庄到j个村庄里建一个邮局,邮局所建的位置由决定于i到j之间的村庄的数量 ,如果数量为奇数的话 直接处于最中间的点,如果为偶数的话,处于最中间的2个点之间。(鉴于你不在我身边,证明原创 2013-08-02 17:13:38 · 790 阅读 · 0 评论