DP
文章平均质量分 73
paradiserparadiser
中国地质大学(北京)CS专业......ACM/ICPC酱油一瓶
展开
-
poj 1631 Bridging signals
题意:题目太长了,模模糊糊终于知道这是个求最长上升子序列的题目。开始果断用以前的方法((0(n^2)),果断TLE(n思路:其实自己思路就不怎么清楚。这算法利用二分法减少搜索时间,二分法利用了序列的单调性。但是内部的运行步骤还是不清楚(和背包问题一样)……自己慢慢琢磨啊。代码:#include #include #include #define INF 0x7FFFF原创 2012-08-06 14:05:53 · 581 阅读 · 0 评论 -
POJ 3254 Corn Fields (状态压缩DP)
题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案)。分析:方格边长范围只有12,用状态压缩dp好解决。预处理:每一行的障碍用一个状态保存好 每一行不考虑障碍的所有符合要求的状态保存好 第一行的方案数记录好。然后一行一行递推,每一行只与上一行有关。#include #include #incl原创 2013-08-16 21:55:55 · 793 阅读 · 0 评论 -
POJ 2411 Mondriaan's Dream (状态压缩DP)
题意:给定一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种。分析:横着放为11,竖着放为竖着的01,所以判断相邻两行是否被完全覆盖:只需判断两行状态合集(j | k)是否是满的, 两种状态是否有冲突(j & k)。第一行直接预处理就行。#include #include #include #include using namespace std;__int原创 2013-08-17 11:55:34 · 725 阅读 · 0 评论 -
HDU 3681 Prison Break (二分答案+状压DP+bfs预处理)
题意:机器人从F出发,走到G可以充满电,走到Y关掉开关,D不能走进,要求把所有开关关掉,且机器人存储的电量最少,并求出该最小电量。分析:把F,G,Y三种类型的点找出来,进行讨论,首先bfs处理出来各个点之间的最短路。现在题目就变成了:求一幅图中满足走遍所有Y点的条件,机器人存储的电量最少。由于点最多只有15个,状压dp来处理。二分机器人的储电量,每次用dp来做判定条件。原创 2013-08-28 19:46:21 · 882 阅读 · 0 评论 -
HDU 2825 Wireless Password(AC自动机+状压DP)
题意:有一个长为n(n构造AC自动机进行搜索,dp【i】【j】【k】表示字符串长度为i,匹配字典树上的第j个节点,并且已经匹配上k个magic word时的总数。则转移方程为 (dp【i+1】【j的儿子】【k | j的儿子的状态】 += dp【i】【j】【k】) % mod;需要注意的是,因为单词可以重复使用,所以单词结尾的fail 指向root 指向的各节点#incl原创 2013-08-30 16:15:24 · 773 阅读 · 0 评论 -
HDU 4165 Pills (dp解法)
题意: 将题意转化为有n个w,和n个h,现在要将他们组成一个2 * n 的字符串,问有多少种组成方式,要求是对于任意一个位置i,0~~i位置中,w的个数不小于h的个数。表示不知道卡特兰数,也不知道这只是个递推式..............用常规dp写法,dp[i][j]表示,前i个字符组成的串中,有j个w的总数,如果第i个字符用的是w 则dp[i][j] += dp[i-1][j-原创 2013-10-02 21:07:33 · 1562 阅读 · 0 评论 -
POJ 1185 炮兵阵地(状态压缩DP)
题意:由方格组成的矩阵,每个方格可以放大炮用P表示,不可以放大炮用H表示,求放最多的大炮,大炮与大炮间不会互相攻击。大炮的攻击范围为两个方格。分析:这次当前行的状态不仅和上一行有关,还和上上行有关,所以用三维dp【i】【j】【k】来表示第i行的状态为j,i-1行状态为k时最多的大炮。一开始看数据量为100 * 1024 * 1024 铁定要爆,但是由于大炮的攻击方式,单独看每一行最多只有几原创 2013-08-17 21:06:54 · 779 阅读 · 0 评论 -
HDU 4597 Play Game (对抗搜索)
题意: 现在有两堆卡牌,每堆都为N张,每张卡牌有一定的分数,有A,B两个人,他们能从这两堆中的顶部或者底部抽出一张牌,并且拥有该分数,问当A先手时,他能获得的最大分数。用dp【t1】【d1】【t2】【d2】表示在剩下的卡牌中(第一堆为t1--d1,第二堆为t2--d2),即将抽取牌的人能获得的最多分数。怎么转移呢? 假设游戏当前所剩卡牌分数为cur, 则当前能获得的最大分数,为cu原创 2013-09-23 21:26:32 · 1154 阅读 · 0 评论 -
HDU 4753 Fishhead’s Little Game (对抗搜索)
题意:在3*3的方格中,有4*4=16个点,标号分别为1~16,A、B两人轮流玩游戏,每次可以添加一条边(相邻节点),如果恰好能够凑成一个边长为1的正方形则得一分,两个的话得2分。现在给定两人已经连接的n条边后,求最终格局谁会胜。因为总计只有24条边,而且只能剩下0--12条边,所以状态压缩记录好剩下还没走好的步数,dp[i]表示状态i下,当前玩家能获得的最大分数。如何处理连边,方原创 2013-09-24 00:14:09 · 1340 阅读 · 0 评论 -
HDU 4576 Robot (概率DP)
暴力DP求解太卡时间了...........写挫一点就跪了//hdu robot#include #include #include #include using namespace std;inline void RD(int &ret) { char c; do { c = getchar(); } while(c '9')原创 2013-08-14 14:12:39 · 845 阅读 · 0 评论 -
POJ 3311 Hie with the Pie (BFS+最短路+状态压缩)
题意:类似于TSP问题,只是每个点可以走多次,求回到起点的最短距离(起点为点0)。分析:状态压缩,先预处理各点之间的最短路,然后sum【i】【buff】表示在i点,状态为buff时所耗时。。。。。。。所以把10 * 1024 种状态来一遍,取sum【0】【(1只是把状态压缩DP改成bfs+状态压缩了#include #include #include #include原创 2013-08-22 23:27:46 · 855 阅读 · 0 评论 -
HDU 3001 Travelling (三进制状态压缩DP+BFS)
题意:有n个点(n分析:每个点最多经过两次,则用三进制保存状态,一个好的技巧就是开个pos数组,记录每个状态用三进制表示时,每一位的情况。 枚举每个点为起点,然后每次sum值是不需要清空的,清空了反而造成了诸多重复遍历....................#include #include #include #include #define INF 0x7FFFFF原创 2013-08-23 11:13:57 · 1421 阅读 · 0 评论 -
Poj 1050 To the Max
题意:给你一个数字矩阵,求最大子矩阵和。 注意:有负数情况。例如:(1):0 -2 -7 0 (2):9 2 -6 2 (3):-4 1 -4 1 (4):-1 8 0 -2 is in the lower left corner: 9 2 -4 1 -1 8 and has a sum of 15.思路:会求一个数列的最大子段和,这次是二原创 2012-08-07 10:15:09 · 493 阅读 · 0 评论 -
Poj 2250 Compromise
CompromiseTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 4965 Accepted: 2266 Special JudgeDescriptionIn a few months the European Currency Unio原创 2012-08-27 15:35:19 · 724 阅读 · 0 评论 -
hdu 1421 搬寝室
状态转移方程还是很难找啊......感觉自己分析很不到位,依旧参考了别人的分析...... #include #include #include #include #include # define MAX 2005using namespace std;int n,k;int a[MAX];int dp[MAX][MAX]; //前i个物品原创 2013-05-28 09:37:39 · 1037 阅读 · 0 评论 -
POJ 3249 Test for Job(记忆化搜索)
题意:给定一个有向无环图,每个结点有权值,从入度为零的点作为起点,出度为零的点作为终点,要求出到终点时可能的最大权值(权值可能为负数,不过都不超过int)思路:记忆化搜索,很多人反向建图来做,不知道有什么好处。我还是正常顺序。事先记录好各点的入度,枚举这些点搜索出的可能最大权值。这种题目的状态转移方程还是很好分析的dp[i] = v[i] + max(dp[u0],dp[u1],.....原创 2013-07-24 15:28:24 · 1340 阅读 · 0 评论 -
hdu 1978 How many ways(DP | 记忆化搜索)
状态转移方程:dp[i+k][j+l] = (dp[i+k][j+l] + dp[i][j]) % 10000;dp[i][j]表示到达点(i,j)的途径数, 其中k,l为处在点(i,j)时,能够到达点(i+k,j+l)。#include #include #include #include #include #include #include #include #incl原创 2013-05-27 18:13:05 · 1034 阅读 · 0 评论 -
HDU 4276 The Ghost Blows Light(树形DP)
题意:给出一棵无向树,从1走到n,总时间为T,每走一条边需要花费一定时间,每个结点有一定权值,问在指定时间内到达n点能获取的最大权值。由于已经到过的点能再次返回(虽然不能再次获得该点权值),情况数倍增.....普通搜索必然爆参考大家的方法:先用某种方法跑出1到n的最短路径,如果时间限定之内,继续,因为最短路上的边只会走一遍才是最优的,多走就是多余的,将最短路的边的时间变为0,总时间原创 2013-07-30 11:12:24 · 1097 阅读 · 0 评论 -
HDU 多校第三场
HDU 4630 No Pain No Game思路: 考虑从左到右扫描,对于每个数,记录在它之前出现,并且最靠右边的那个它的倍数,用previ表示。考虑当前数i的所有约数x,对于所有r >= i,l 用树状数组或者线段树维护(此题线段树速度巨慢)因为n只有5W,可以预处理好倍数约数关系#include #include #include #include #inclu原创 2013-07-31 03:53:15 · 1312 阅读 · 0 评论 -
POJ 2823 Sliding Window (RMQ + 滚动数组)
正常的RMQ询问区间的最大最小值问题,只是如果普通的开dp[i][j]的话,铁定超内存。题目中给定了询问的区间长度k所以,只需要用一位数组存dp[i]表示i到i+k-1区间的最值#include #include #include #include #include #include #include #include #include #include #in原创 2013-08-21 10:49:16 · 1275 阅读 · 2 评论 -
数位DP练习
详见:刘聪的论文,写的很详细......#include #include #include using namespace std;int f[35][35]; //前 i 位有 j 个 1 的个数...int x,y,b;int pos[35];int len;void init() { //预处理 memset(f,0,sizeof(f));原创 2013-10-28 20:41:59 · 1073 阅读 · 0 评论