动态规划
文章平均质量分 70
冷月残星
这个作者很懒,什么都没留下…
展开
-
动态规划(Hearthstone,HDU 5816)
看到N,M都很小,一开始想到了暴力搜索+剪枝可以枚举出能够完成击杀的牌的组合,计算量最多为2^20=1e6,(看到网上用状压来枚举,虽然不带剪枝,但是常数应该更小)。然后在深入考虑预估函数的剪枝效率时,发现P也很小,好像可以动态规划。dp[i][j][k]表示对于前i张火球术,恰选j张,恰打出k点伤害的概率,dp完后后缀和一下就可以得到前i张火球术,恰选j张,打出大于等于k点伤害的概率。原创 2017-07-27 20:21:55 · 386 阅读 · 0 评论 -
动态规划(串并联网络,uva 10253)
#include#define maxn 35using namespace std;typedef long long ll;ll dp[maxn][maxn];ll f[maxn];ll C(ll m,ll n){ double ret=1; for(ll i=0;i<n;i++) ret*=m-i; for(ll i=1;i<=n;i原创 2016-11-16 22:24:01 · 454 阅读 · 0 评论 -
树形DP(放置街灯,uva 10859)
前面也做了一道很像的题,那道题只要求放置的数目最少,要求覆盖的是点。在这题中,要求覆盖的是边,不但要求放着的数目最少,更要求覆盖两次的边最多。因此贪心法不再适用,最少要多少个点可以贪心求出,但是同时要求覆盖两次的边要最多却不是贪心法能够解决的,无论如何都是逃不过动态规划的。所以一开始用贪心做,做到最后发现方法是错的。看了大白书才开始用动态规划。大白书上的方法好奇怪,dp[i][j]代表原创 2016-10-31 21:19:58 · 474 阅读 · 0 评论 -
枚举,集合,动态规划(黑客的攻击,uva 11825)
很容易想到这是一个集合覆盖问题。我已开始还脑抽了,用什么强连通分量= =,他只是能中止相邻的,又不是中止一个块,但是样例能过。。。只能说自己有时候真的都没静下心来认认真真想清楚,分析好自己算法的正确性,而是瞎想觉得差不多啦就开始写代码了。WA后又想了一个错误的解法。自己应该先确定算法,然后在纸上证明正确性,然后纸上跑几个数据,再编码才好。这种瞎想出来的解法,更是要严谨,不能随便脑子里模拟几原创 2016-10-29 11:15:01 · 406 阅读 · 0 评论 -
区间DP(Sum游戏,uva 10891)
以前做过类似的题目,几乎就一样,所以很快就做出来了。dp[i][j]代表对区间[i,j]先出手的最优解,那么枚举所有决策,区间dp一下就ok了。因为先手取完后,就轮到后手取,后手取就相当于对取完后的状态的先手取。相减就是答案。代码#include#define maxn 110using namespace std;typedef long lon原创 2016-10-28 01:04:32 · 386 阅读 · 0 评论 -
数位DP(数字和与倍数,uva 11361)
这道题拖了一整天,WA了无数发,感觉自己数位DP特别弱,其实可能就是因为自己数学比较弱,或者说在推导和代入繁杂的公式以及边界很粗糙的讨论上太不够严谨了,总是觉得大概对就对了,这在数学题上是非常致命的缺点,因为公式错一点点就直接WA,讨论一遗漏也直接WA。然而这道题真蛋疼,明明公式错了,然而样例甚至自己生成的大部分数据都能过。。。数位DP还需要大量的练习,太不够熟练了。然后是原创 2016-11-09 11:49:01 · 1609 阅读 · 0 评论 -
LCS,LIS(王子和公主,uva 10635)
一开始就按着LCS做。超时。还是该好好分析一下时间复杂度,O(pq)==O(n^4),只能跑规模为n==100的数据,然而n==250。竟然把LCS问题转化成了LIS问题。。之所以可以转化,那是因为两个序列内的元素都分别是不重复的。把第一个序列内所有元素根据顺序按正整数编号。不用把数据保存下来,只用编好号就OK。然后读入第二个序列,如果这个元素没有编号,说明原创 2016-10-28 00:43:44 · 405 阅读 · 0 评论 -
动态规划(Funny Game,cf 731E)
参考代码 blog.csdn.net/sdfzyhx/article/details/52832832第一步是要确定状态,dp[i]表示前i个缩成一堆的情况下先手的最大值。dp[i]表示前i个缩成一堆很好想,关键是表示什么的值。题目要求求先手的最大值,因此表示此值十分合理。然后是状态转移,自己做的时候不知道该怎么处理两个人,因为一个人的最优解得根据另一个人的最优解才能求出,所以我就转载 2016-10-17 21:33:05 · 812 阅读 · 0 评论 -
区间DP(多叉树的遍历,LA 3516)
放在数学专题里,想不出数学的方法,但觉得可以用区间DP求解。如果是二叉树就很好解决,只用枚举一下中间的回归点就好,复杂度O(n^3)。但是偏偏求得是多叉树,自己只能想到位向量枚举集合或者dfs的方法。可以剪枝但无法避免最差情况,然后就不会了。最近在紫书和大白书上做了很多动态规划的题目,有了很多感触,看了这道题的解法后又有了新的理解。就是说动态规划不一定只能从旧状态转移到新状态,也可原创 2016-11-07 21:45:43 · 738 阅读 · 0 评论 -
动态规划,递推(杆子的排列,uva 1638)
一开始用排列组合做,写完了后才发现是错的,虽然能过样例。以后一定要先确定解法正确,再编写代码。否则简直浪费时间。最后看了书是用动态规划。动态规划的特点就是有状态和决策。我们可以通过在某个状态上的某个位子放一个杆子来转移到下一个状态。紫书上说杆子的具体高度不影响结果,我的理解就是你只用知道所有杆子的长度不同,长和短是相对而言的,题目要求你出所有不同长短关系的序列。我们发现通过放一原创 2016-09-29 13:53:37 · 728 阅读 · 0 评论 -
概率DP,记忆化搜索(纸牌游戏,uva 1637)
有时候编码解码映射太麻烦,干脆多开几维数组得了。搜索的话可以考虑用记忆化。#includeusing namespace std;char pai[9][4];int kase;int vis[5][5][5][5][5][5][5][5][5];double d[5][5][5][5][5][5][5][5][5];double dp(int a1,int a2,in原创 2016-09-28 22:10:00 · 448 阅读 · 0 评论 -
动态规划,递推,多段图(Ingenuous Cubrency,uva 11137)
多段图问题是一种特殊的动态规划。状态转移像是一种跳跃。动态规划的值是路径数。对于每一个状态,遍历所有可以转移的下一个状态,然后把自己的路径数加给它。或者对于每一个状态,遍历所有可以转移给他的状态,然后把它的路径数加给自己。题目往往会问有多少个,有多少种。一般来讲有两种解法:第一种是先枚举状态,再枚举转移,这时所求的路径数是转移的排列。上一题便是如此。第二种先枚举转移原创 2016-11-03 23:29:08 · 728 阅读 · 0 评论 -
动态规划,单调队列(捡垃圾的机器人,LA 3983)
自己用优化了空间的O(NC)算法写,WA是因为格式和long long。以后要仔细看输出那一栏的全部输出细节,以及输入那一栏的数据范围。还好C才100,所以没有超时。但是大白书上的方法却优化到了O(N),也就是C很大也能过,十分优秀。先将自己的O(NC)算法。dp[i][j]表示捡完第i个垃圾后剩余j空间的最短路程。如果是-1说明没有此状态。那么状态转移方程:原创 2016-11-02 21:18:33 · 1791 阅读 · 0 评论 -
概率DP,递推(麻球繁殖,UVA 11021)
能想到是概率DP,但是定义状态dp[i][j]第i天剩j个麻球。然后麻球数量可能会繁殖到非常多,状态太多数组开不下,然后就不会了。感觉自己总是轻易就放弃了,还是应该再思考一下,一般遇到这种想到DP但是数组开不下或者转移方程找不到或者转移方程太复杂的时候就应该想想可不可以优化,而不是直接就放弃。开不下就把状态定义得简单一些,看看是不是有哪些维是没必要记录,而只需要特别处理一下就好,或者重原创 2016-11-22 09:48:21 · 398 阅读 · 0 评论 -
概率DP,记忆化搜索(Expect the Expected,uva 11427)
很容易发现每天晚上是独立的,只要求出了一天晚上的胜率Q,那么答案就是求一个连胜几天的数学期望Ex=∑i*(1-Q)*Q^(i-1)=1/(1-Q),期望就是一个收敛数列的和。其实就是差比数列的和啦,可以推出公式然后O(1)算出。自己算胜率的时候算得很迷,一是看成获胜比例大于一半才停止,二是一直想着算胜率而不是败率,算了半天也没算出来。自己真的很不踏实,很浮躁,很瞎搞,做事应该稳原创 2016-11-24 19:06:36 · 363 阅读 · 0 评论 -
矩阵快速幂,动态规划(cjj's string game,HDU 5863)
一开始考虑后缀数组。但有两个原因感觉不行。1、没有一个给定的串让我来处理成后缀数组。2、发现n很大,1e9,但m很小才10。时空完全无法承受。然后考虑计算出来。很容易想到让第一个串随便组合,然后尝试让第二个串满足它。对于任意一个串,要求另一个串满足它的方案数都是一样多的。满足的条件只关乎每个下标上的字符是否相等。显然和具体字符无关,只和字符的种数有关,所以方原创 2017-07-23 22:21:52 · 408 阅读 · 0 评论 -
动态规划,背包问题,卡题(CRB and His Birthday,HDU 5410)
题目链接:https://vjudge.net/problem/HDU-5410以前学习过一种解法。用完全背包的方法来做多重背包的题目。博客链接:http://blog.csdn.net/xl2015190026/article/details/54583263其中用到了一个used数组。由于转移只有一种,而且前置状态越大越好,所以这种做法是正确的。一开原创 2017-07-22 12:33:20 · 299 阅读 · 0 评论 -
动态规划,计数DP,模拟(Persistent Link/cut Tree,HDU 5401)
题目链接:https://vjudge.net/problem/HDU-5401系统相对比较复杂的动态规划,所以看上去有点像模拟。参考博客:http://blog.csdn.net/u013007900/article/details/47760825TEL了好久。原因是使用了stl的map,被卡了常数。stl的map的常数大概是自己实现trea原创 2017-07-17 12:56:57 · 280 阅读 · 0 评论 -
区间DP,组合数学(Expression,HDU 5396)
dp[i][j]表示区间[i,j]的答案。如果区间长度为len,那么这个区间的答案一定是经过len-1次操作得到的。所以我们从长度为len的区间转移向长度为len+1的区间时,需要枚举一个符号,这个符号就是第len次操作使用的符号。每个符号求到的答案加起来就是这个区间的答案。假设现在我们关注符号p。符号左边有a种情况,第i种为A[i],符号右边有b种情况,第j种为B[j]。如果符号原创 2017-07-16 19:47:22 · 292 阅读 · 0 评论 -
计数DP(Zero Escape,HDU 5389)
利用树根的特性,1~9的小范围,组合数公式等进行dongtai原创 2017-07-15 14:09:36 · 246 阅读 · 0 评论 -
树形DP,计数DP,概率DP(HDU 5378,Leader in Tree Land)
参考博客http://blog.csdn.net/firenet1/article/details/47445921http://blog.csdn.net/pibaixinghei/article/details/52783432有两种方法,一种是计数DP,另一种是概率DP。计数DP:应该都能想到dp[i][j]表示以i为根的子树,有j个领导。接下来考虑状原创 2017-07-14 16:36:46 · 524 阅读 · 0 评论 -
树上记忆化搜索(Crazy Bobo,HDU 5325)
树形DP,就是在树上进行动态规划,这要求树是一个有向无环图。对于大部分题目而言,要么给你一棵有向树(又称有根树)(同时也是一个有向无环图),要么给你一棵无向树,你可以根据需要转化成有向树(又称有根树)(同时也是一个有向无环图)来处理。具体处理方式就是一遍,两遍,甚至多遍dfs。本题的话,我们可以用有方向的树来建模,虽然这棵树是一个有向无环图,但它不是一棵有向树(有根树),所以常规的dfs方法没原创 2017-06-09 14:14:44 · 390 阅读 · 0 评论 -
动态规划,多重背包,保存路径,用完全背包的方法做多重背包(Charlie's Change,poj 1787)
就是用拆分物品的方法做的多重背包啦,时间复杂度为O(V∑logN[i]),空间复杂度为O(V)。由于是拆分物品,所以保存路径时不但要记录转移前的位置,还要记录当前硬币的类型以及使用的个数,输出前沿着路径找回去统计一下个数就好啦。一直WA不知所措,以为是算法问题一直找BUG,后来发现原来是一个quarters本来是25cents抄成了15cents。最后是自己带数据去测试才找到问题所在。写了这么多题原创 2017-01-17 15:16:22 · 1328 阅读 · 0 评论 -
树形DP(Simple Tree,玲珑杯 Round#8 B lonlife 1080)
一开始总觉得是dfs序之类的问题,子树中的数量很好解决,一直在思考如何往上求数量。很久后才注意到边带权,然后只好放弃dfs序,只能考虑树形DP了。然后就是经典的求树的直径的改造。然后写搓了(大概就是第一遍dfs的时候维护的量不够多,所以在第二次dfs时就得用更多的运算量去弥补,即没有用更多的空间去换时间,所以超时了,以前这么写都能过啊,这次就不行了,更重要的是自己写得很不熟练,很多细节都搞错了,W原创 2017-01-14 16:31:28 · 270 阅读 · 0 评论 -
石子合并,四边形不等式优化(Buy Candy,玲珑杯 Round#6 A lonlife 1066)
转载了给自己看http://blog.csdn.net/u014800748/article/details/45750737http://www.cnblogs.com/gj-Acit/p/4493512.html我就说一下结论:正常的区间dp,时间复杂度为O(n^3),即枚举区间长度+枚举区间左边界+枚举分割点。下面优化到O(n^2)。对于下标a如果转载 2016-12-17 18:57:51 · 359 阅读 · 0 评论 -
随机转移(Race to 1,UVA 11762)
就是状态转移是有概率的,但要求的是期望,那就用全期望公式写出状态转移方程就好了,这个状态机有些有趣,就是一定概率变成自己,所以写出出全期望公式后变形一下就是状态转移方程,然后正常的记忆化搜索就好了。画出状态转移图有助于写出正确的公式。在动态规划里状态转移方程就是一切,写错一点就什么都没了。画图是个不错的辅助技巧。写出公式后一定要化简,这甚至可能是最关键的一步。代码#include原创 2016-11-24 22:26:17 · 334 阅读 · 0 评论 -
动态规划,递推,高精度(Matches,uva 11375)
第二次用JAVA交题。还是写得一脸懵逼。给点链接JAVA高精度基础http://blog.csdn.net/l04205613/article/details/6873991第一次交JAVAhttp://blog.csdn.net/xl2015190026/article/details/52887202动态规划用刷表法,缺点是要先全部置0,优点是转移简单,原创 2016-11-03 21:37:32 · 368 阅读 · 0 评论 -
动态规划,记忆化搜索(分享巧克力,LA 4794)
能想到是那种枚举子集的动态规划,结果写着写着成了模拟了= =。S是位向量,代表着巧克力的集合。dp[S]是一个vector,里面装着巧克力集合S能拼出的长方形。模拟转移方程就是枚举S的子集S0,S1,然后拼出一个长方形,然后排序去重。。。果断超时。其实这种O不OK的问题,状态转移方程都是一旦有一种决策OK,那就OK。问题在于状态是啥,转移方程是啥。很容易想到dp[S原创 2016-11-03 01:04:55 · 885 阅读 · 0 评论 -
数位DP(越大越好,uva 12105)
http://blog.csdn.net/keshuai19940722/article/details/25080553学到一个小细节,调用strcpy(a,b)前一定要让a="\0"或者memset(a,0,sizeof(a))。否则会出问题。#includeusing namespace std;int n,m;int kase;char dp[110]转载 2016-09-26 16:55:44 · 643 阅读 · 0 评论 -
动态规划(划分成回文串,uva 11584)
对每个位子进行DP时要先初始化一下他的值,这是就要考虑到有没有在接下来的循环中没能考虑到的边界情况,如果有,就在这些没有考虑到的情况中选一个最优解最为初始值,情况很少,往往判断一下就OK。如果没有遗漏的情况,那就给他赋一个一定会被替换的值,比如求最小值,你就给他赋INF,求最大值,你就给他赋-1或-INF。但要保证这个值一定会被替换,而且不会被认为是某个正确的结果。#includeu原创 2016-09-19 11:01:29 · 862 阅读 · 0 评论 -
动态规划(照明系统设计,uva 11400)
参考资料:http://acm.lilingfei.com/uva-11400-lighting-system-design-%E4%BE%8B%E9%A2%989-6_138只能往上换,不能往下换,电压最高的灯泡必须保留。参考资料上证明了不能隔着换。代码#includeusing namespace std;struct bb{ int V,K,C转载 2016-09-18 21:27:23 · 537 阅读 · 0 评论 -
01背包,恰好装满(劲歌金曲,uva 12563)
关于不一定装满与恰好装满: http://blog.sina.com.cn/s/blog_150cffdab0102w0g9.html参考代码:http://blog.csdn.net/acvay/article/details/43601791我的代码#includeusing namespace std;int n,t;int dp[20000];转载 2016-09-18 20:18:51 · 842 阅读 · 0 评论 -
动态规划(Unidirectional TSP,uva 116)
dp里面sort用的好棒,我本来讨论了老半天的。。。#includeusing namespace std;const int INF=1<<30;int n,m;int MAP[11][110];int dp[11][110];int NEXT[11][110];int main(){ while(scanf("%d %d",&n,&m)!=EOF)原创 2016-09-16 23:09:14 · 357 阅读 · 0 评论 -
记忆化搜索,动态规划(旅行,uva 1347)
看到这题想起了一个网络流的题目,就是说找两条不相交的路,使得总花费最短,解决办法是拆点法。这道题用网络流做边太多了,估计不行。。。#include#define maxn 1010using namespace std;typedef long long ll;ll n;struct pt{ ll x,y;};pt PT[maxn];double dp[原创 2016-09-16 21:04:57 · 398 阅读 · 0 评论 -
记忆化搜索,动态规划(巴比伦塔,uva 437)
#include#define INF 0X3F3F3F3Fusing namespace std;int n;int blc[35][3];int dp[35][3];int kase;int DP(int k1,int k2){ int& ans=dp[k1][k2]; if(ans>0) return ans; ans=blc[k1][k2];原创 2016-09-16 20:16:25 · 639 阅读 · 0 评论 -
动态规划(城市里的间谍,uva 1025)
#include#define INF 0X3F3F3F3Fusing namespace std;int N,T;int t[55];int M1,M2;int d[55];int e[55];int dp[210][55];bool ht[210][55][2];int kase;int main(){ while(scanf("%d",&N),N)原创 2016-09-16 18:36:20 · 736 阅读 · 0 评论 -
动态规划,离散化(Sonya and Problem Wihtout a Legend,cf 713C)
http://blog.csdn.net/miracle_ma/article/details/52537208具体讲解上面博客写的很清楚了。然后我又想了想为什么不能跳过ai-i,然后dp时循环到j-1。原因是ai的范围是1到1e9,如果直接dp严格递增,那么dp就得从1循环到1e9,这样无论是在空间还是时间上都是不允许的。然而转化ai-i后,问题转化成了非严格递增,那转载 2016-09-15 21:13:41 · 1174 阅读 · 0 评论 -
动态规划(Generate a String,cf 710E)
一直想着用优先队列dfs呢。。超时。。动态规划真是好东西。#includeusing namespace std;typedef long long ll;ll dp[10000010];ll n,x,y;int main(){ scanf("%I64d %I64d %I64d",&n,&x,&y); dp[1]=x; for(int i=2原创 2016-08-23 00:56:34 · 399 阅读 · 0 评论 -
树形dp(Centroids,cf 708C)
dp[i][j]表示:i等于0时,表示j往下(包括j)点的数量。i等于1时,表示j往上(不包括j)点的数量。qie[i][j]表示:i等于0时,表示j往下(包括j)能切的最大值。i等于1时,表示j往上(不包括j)能切的最大值。显然最大值往下就包括,往上就不包括。这是一个非常好的方法,细细体会。dfs时可以先枚举子节点进行dp,然后再dfs。可以解决许多难以求原创 2016-09-01 03:57:03 · 306 阅读 · 0 评论 -
动态规划(Coloring Trees,cf 711C)
#includeusing namespace std;typedef long long ll;const ll INF=0X3F3F3F3F3F3F3F3F;ll n,m,K;ll c[110];ll cost[110][110];ll dp[110][110][110];int main(){ scanf("%I64d %I64d %I64d",&n,&m,&K原创 2016-09-01 02:46:33 · 710 阅读 · 0 评论