![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
记忆化搜索
文章平均质量分 75
冷月残星
这个作者很懒,什么都没留下…
展开
-
记忆化搜索,动态规划(巴比伦塔,uva 437)
#include #define INF 0X3F3F3F3F using 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 · 627 阅读 · 0 评论 -
Dijkstra,记忆化搜索(林中漫步,UVA 10917)
就是先对终点求一个单源最短路,然后再对起点跑一个记忆化搜索。 一开始搞错家和公司的位置了。。。卒。。。 如果没AC,别太发牢骚,一定是你哪里没做好了。 如果不用心,啥都做不好的。 代码 #include #include using namespace std; typedef long long ll; const ll maxn = 1010; const l原创 2017-02-10 10:33:46 · 388 阅读 · 0 评论 -
强连通分量,DAG上的最长路,记忆化搜索(最大团,UVA 11324)
一点手误,搞WA了。。。 代码 #include #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn = 1010; const int maxm = 50010; int pre[maxn],lowlink[maxn],cnt[maxn],sccno[maxn],dfs_clock原创 2017-02-09 17:57:47 · 484 阅读 · 0 评论 -
记忆化搜索(Mahmoud and a Message,cf 766C)
学习任何东西都是这样吧。如果长时间没有练习就会生疏和遗忘。 大概唯一的办法就是长时间的反复练习。或者专题训练+打比赛也是不错的。 学而时习之,不会忘乎。。。。。。。。。。 希望自己能越来越会学习。 官方题解是动态规划,我的是记忆化搜索,不过都大同小异了。dp[i]表示后缀i的答案,dx[i]表示后缀i的最少划分。 然后就一路记忆化搜索过去即可,最多有n个状态,时间复杂度为O(n)原创 2017-02-08 13:12:44 · 394 阅读 · 0 评论 -
随机转移(Race to 1,UVA 11762)
就是状态转移是有概率的,但要求的是期望,那就用全期望公式写出状态转移方程就好了,这个状态机有些有趣,就是一定概率变成自己,所以写出出全期望公式后变形一下就是状态转移方程,然后正常的记忆化搜索就好了。画出状态转移图有助于写出正确的公式。在动态规划里状态转移方程就是一切,写错一点就什么都没了。画图是个不错的辅助技巧。写出公式后一定要化简,这甚至可能是最关键的一步。 代码 #include原创 2016-11-24 22:26:17 · 324 阅读 · 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 · 353 阅读 · 0 评论 -
排列组合,递推,记忆化搜索(葛伦堡博物馆,LA 4123)
就是容易发现一共有numo=(n-4)/2个O,一共有numr=(n+4)/2个R。然后不能有两个O连在一起,头和尾同时为O也不行。就是插空法啦。现在C(numr+1,numo)-C(numr-1,numo-2)。意思是numr+1个空里选numo个减去numr-1个空里选numo-2个。即随便插空减去头和尾都是O的情况。由于(numr-numo) 书上用的是递推,记忆化搜索。虽然麻烦但原创 2016-11-15 09:45:37 · 609 阅读 · 0 评论 -
概率DP,记忆化搜索(纸牌游戏,uva 1637)
有时候编码解码映射太麻烦,干脆多开几维数组得了。搜索的话可以考虑用记忆化。 #include using 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 · 442 阅读 · 0 评论 -
动态规划,记忆化搜索(分享巧克力,LA 4794)
能想到是那种枚举子集的动态规划,结果写着写着成了模拟了= =。 S是位向量,代表着巧克力的集合。 dp[S]是一个vector,里面装着巧克力集合S能拼出的长方形。模拟转移方程就是枚举S的子集S0,S1,然后拼出一个长方形,然后排序去重。。。果断超时。 其实这种O不OK的问题,状态转移方程都是一旦有一种决策OK,那就OK。 问题在于状态是啥,转移方程是啥。 很容易想到dp[S原创 2016-11-03 01:04:55 · 876 阅读 · 0 评论 -
记忆化搜索,状压DP(20个问题,uva 1252)
要学会找到“决策”和“状态”。 在这题中,“决策”无非就是问哪个问题,而问过的问题就不能再问了,因此需要已问过哪些问题的“状态”。每次询问,无非得到两个结果,是或不是,所以还需要“状态”:问过的问题中,那些得到了肯定的回答。问问题的顺序不会影响结果,因此需要记忆化搜索。 状态转移方程: ans=min(ans,max(dp(s|(1 题目要求找最少问几次保证问出。 保证问出原创 2016-09-21 18:40:49 · 609 阅读 · 0 评论 -
记忆化搜索,状压DP(校长的烦恼,uva 10817)
每门课至少有两名教师可以教。 定义三维d[i][s1][s2]的状态,对于第i到最后一个教师,有且只有1个老师的课的集合是s1,大于等于2个教师的课的集合是s2。 前m个教师都不能辞退,因此必须选,此时d[i][s1][s2]=d[i+1][s1'][s2'],其中s1',s2'分别是是选了第i个教师后的s1和s2。 其他教师可选可不选。 不选的话d[i][s1][s2]=d[i+1][s原创 2016-09-21 15:49:15 · 377 阅读 · 0 评论 -
【2016-沈阳赛区网络赛-G】记忆化搜索,数位DP(odd-even number,hdu 5898)
http://www.cnblogs.com/fightfordream/p/5885788.html #include using namespace std; typedef long long ll; ll cnt; ll bit[20]; ll d[20][20][2][2]; ll dp(ll pos,ll len,ll pre,ll zero,ll f) { if转载 2016-09-23 14:28:18 · 322 阅读 · 0 评论 -
记忆化搜索(跳舞机,uva 10618)
今天写了好久都没写出来,后来看别人代码才过了。 刚开始写的时候,觉得决策十分复杂,一直在讨论,写了很长。后来打印决策的时候遇到了更大的麻烦,只好用dfs递归去打印。代码长到爆炸,而且还WA了。 后来看别人代码,学到几个技巧。 在dp时直接暴力枚举所有决策,然后写一个函数判断是否合法即可。 能量消耗也不需要在dp时判断,直接交给函数处理就好了。 最开始之所以WA是因为路径保存错了。我只保存原创 2016-09-22 19:59:38 · 658 阅读 · 0 评论 -
记忆化搜索,动态规划(旅行,uva 1347)
看到这题想起了一个网络流的题目,就是说找两条不相交的路,使得总花费最短,解决办法是拆点法。 这道题用网络流做边太多了,估计不行。。。 #include #define maxn 1010 using namespace std; typedef long long ll; ll n; struct pt { ll x,y; }; pt PT[maxn]; double dp[原创 2016-09-16 21:04:57 · 389 阅读 · 0 评论 -
树上记忆化搜索(Crazy Bobo,HDU 5325)
树形DP,就是在树上进行动态规划,这要求树是一个有向无环图。对于大部分题目而言,要么给你一棵有向树(又称有根树)(同时也是一个有向无环图),要么给你一棵无向树,你可以根据需要转化成有向树(又称有根树)(同时也是一个有向无环图)来处理。具体处理方式就是一遍,两遍,甚至多遍dfs。 本题的话,我们可以用有方向的树来建模,虽然这棵树是一个有向无环图,但它不是一棵有向树(有根树),所以常规的dfs方法没原创 2017-06-09 14:14:44 · 380 阅读 · 0 评论