
动态规划/记忆化搜索
jzq233jzq
这个作者很懒,什么都没留下…
展开
-
区间DP(记搜)——BZOJ1032/Luogu2145 [JSOI2007]祖码Zuma
题面:BZOJ1032 Luogu2145 一个很明显的区间DP 首先预处理,把相同颜色的连续珠子全部搞到一个数组段里去 v记录该段的数值,w记录该段的长度 定义状态:f[i][j]表示区间从i段到j段全部消掉所需最少珠子数 然后一个最显然最基础的状态转移方程:f[i][j]=min(f[i][j],f[i][k]+f[k+1][j])这是区间DP几乎必有的转移方程了吧,k从i到j-1枚举原创 2017-05-23 20:01:16 · 334 阅读 · 0 评论 -
DP——51nod1486 大大走格子
题面:51nod1486 至于CF原题是什么,我们不去管它 这题的DP思路很有趣。首先如果没有不能走的格子的话,n∗mn*m的棋盘的走法数就是Cm−1n+m−2C_{n+m-2}^{m-1},因为通过转移方程可以很直观地发现是一个杨辉三角 现在考虑到有不能走的格子的问题,我们发现只有这个格子左上的不能走的格子会对走法数产生影响,所以我们只要考虑这些格子就可以了。 然而我们不能直接枚举行和列,原创 2017-09-18 13:40:04 · 470 阅读 · 0 评论 -
DP——51nod1020 逆序排列
题面:51nod1020 虽然这是5级题的第一个题目,但是作为这种水平的DP的话…… 真的好神啊!!!(我貌似从来没有做过这种推状态转移方程的。。。 首先状态就是f[i][j]f[i][j]表示前i个数的排列逆序数的个数 从i−1i-1推到ii的话我们可以考虑到ii排在第i−pi-p个位置上,这样就可以产生p个逆序对 所以朴素的状态转移方程就是f[i][j]=∑p=0i−1f[i−1][j原创 2017-09-08 22:08:27 · 220 阅读 · 0 评论 -
数位DP——Luogu3413 SAC#1 - 萌数
题面:Luogu3413 这好像是我写的第一篇数位DP的blog吧。。。 半原创吧,参考的是我的同学lc233的blog:传送门 首先看到这个数据范围和样例就可以知道这题的主体思路了吧。 我们可以定义状态f[i][j][k]f[i][j][k]表示位数为i的,最高位为j,次高位为k的萌数个数。 一开始推的话很简单: 首先回文串嘛>2就好啦 所以我们只要判断2情况 aa或原创 2017-08-15 23:09:24 · 519 阅读 · 0 评论 -
最短路+DP——BZOJ1003/Luogu1772 [ZJOI2006]物流运输
http://www.lydsy.com/JudgeOnline/problem.php?id=1003 https://www.luogu.org/problem/show?pid=1772#sub 这题一开始,我乍一看,不会做啊(好吧其实这题还是很水的) luogu的题目标签说是DP啊,还有最短路 其实就是这样做的呀(后来发现真的很水) 因为在某一区间段时间内有码头会暂时关闭,所以我们原创 2017-03-13 09:24:03 · 353 阅读 · 0 评论 -
DP——Luogu2543 [AHOI2004]奇怪的字符串
https://www.luogu.org/problem/show?pid=2543 这根本不像是省选题!!!(好吧忘记看年份了) 裸的最长公共子序列,状态转移方程:f[i][j]=f[i-1][j-1]+1(串1位置i与串2位置j匹配)f[i][j]=max(f[i][j-1],f[i-1][j])(不匹配)然而这题n范围大,我们可以把第一位滚存掉#include<bits/stdc++.h原创 2017-03-17 08:26:56 · 517 阅读 · 1 评论 -
DP——Luogu2563 [AHOI2001]质数和分解
https://www.luogu.org/problem/show?pid=2563 比较裸的动态规划 完全背包嘛 我们可以把质数先给筛出来(不要看我用了欧拉筛,其实在这道题等于大材小用)然后直接DP 状态转移:f[j]+=f[j-pri[i]](pri是质数) 设个边界条件f[0]=1就好啦#include<bits/stdc++.h>using namespace std;int原创 2017-03-27 09:14:25 · 622 阅读 · 0 评论 -
树形DP——BZOJ1060/Luogu1131 [ZJOI2007]时态同步
http://www.lydsy.com/JudgeOnline/problem.php?id=1060 https://www.luogu.org/problem/show?pid=1131 怎么说呢,看懂了明白了以后呢就变得很简单了 题目给定了根,因此我们只需要从根开始遍历 我们可以定义状态:f[i]表示从第i个节点到叶子结点的最长距离 叶子结点f[i]为0 其他结点的状态转移方程是原创 2017-03-27 14:10:39 · 361 阅读 · 0 评论 -
记忆化搜索——BZOJ4562/Luogu3183 [HAOI2016]食物链
http://www.lydsy.com/JudgeOnline/problem.php?id=4562 https://www.luogu.org/problem/show?pid=3183 可以搜索的题嘛。。。 首先找入度为零的点(生产者),从生产者开始向下寻找,直到找到出度为零的点(终极消费者)就算找到一条食物链(生物知识) 但是总不可能一条一条搜下去吧,稳T 我们发现这个状态可以记原创 2017-04-14 10:40:02 · 365 阅读 · 0 评论 -
贪心?DP?——BZOJ4582/Luogu3143 [USACO16OPEN]钻石收藏家Diamond Collector
题面处处都有 BZOJ4582 洛谷3143 这个已经不知道是贪心还是DP了。。。 首先对钻石进行排序(肯定的),然后记录状态:f[i]表示1~i区间内能够放到一个架子上的最大值,g[i]表示i~n区间内能够放到一个架子上的最大值 那么答案就是max(f[i]+g[i+1) 状态转移:f[i]=max(f[i-1],i-j+1) j表示能够和i放到一个架子上(差值小于等于k)的最远位置 g[i]同理原创 2017-04-20 09:08:39 · 468 阅读 · 0 评论 -
DP——Luogu2439 [SDOI2005]阶梯教室设备利用
传送门 我们先按结束时间从小到大把演讲排序,然后考虑dp f[i]表示1~i时间能够利用的最长时间 状态转移方程:f[i]=max(f[i-1],f[a[j].begin-1]+a[j].end-a[j].begin+1) 其中j表示结束时间是i的演讲 最后答案是f[a[最后一个].end]#include<bits/stdc++.h>using namespace std;struc原创 2017-04-23 18:36:29 · 629 阅读 · 0 评论 -
树形DP——Luogu2014 选课
题面:传送门 首先显然的这个树形结构的东西是一个森林 我们随便搞一个超级汇点变成一棵树好了 然后问题来了,这棵树是多叉树…… 我想的状态是这样的:f[i][j]表示在以i节点为根的子树内取j个(符合题意)的最大值 转移的时候把子树内的转移到这棵子树的根即可,只不过这个根必选 可惜的是如果按照多叉树来转移的话转移会很麻烦。。。 所以只能多叉转二叉了,也就是说左儿子右兄弟 然后就可以用上原创 2017-05-16 15:45:38 · 551 阅读 · 0 评论 -
DP——BZOJ1855/Luogu2569 [SCOI2010]股票交易
题面:BZOJ1855 Luogu2569 DP肯定的 状态:f[i][j]表示前i天目前持有j股的最大收益 有几种转移方式: 不买不卖:f[i][j]=f[i-1][j] 买:f[i][j]=max(f[i-1][k]-ap[i]*(j-k))(k < j) 卖:f[i][j]=max(f[i-1][k]+bp[i]*(k-j))(k > j) 但是枚举k的话时间复杂度是O(t*ma原创 2017-07-02 22:38:05 · 624 阅读 · 0 评论 -
DP——Luogu1941 [NOIP2014]飞扬的小鸟
题面:Luogu1941 首先可以有这么一个暴力DP f[i][j]表示到第i行高度为j时的最少点击次数 转移直接从前一行枚举点击次数k过来(不写了) 时间复杂度n*m^2,不能接受 那我们试着优化这个DP 首先我们发现点击使小鸟上升这个过程类似于完全背包 那么我们只要改一下上升的转移方程就好了 f[i][j]=min(f[i][j],min(f[i-1][j-p[i-1],f[i]原创 2017-07-06 20:46:04 · 239 阅读 · 0 评论 -
斜率优化DP——BZOJ1010/Luogu3195 [HNOI2008]玩具装箱TOY
题面:Luogu3195 BZOJ1010 本来以为斜率优化是个什么高级东西。。。这题入门之后…… 发现也没什么难的吧O(n2)O(n^2)做法: f[i]f[i]表示选完1~i个物品所花最小花费 转移:f[i]=min(f[j]+(i−j−1+s[i]−s[j]−L)2)f[i]=min(f[j]+(i-j-1+s[i]-s[j]-L)^2) s[i]s[i]表示从1~i的c[i]c[i原创 2017-07-11 08:23:58 · 264 阅读 · 0 评论 -
DP——Luogu1437 [HNOI2004]敲砖块
题面:Luogu1437 首先这个三角形不满足dp的无后效性 那么我们把这个三角形按左上角逆时针旋转90度一下 比如样例 2 2 3 4 8 2 7 2 3 49 转成 4 3 7 2 2 3 2 8 2 49 这样就可以DP了 定义状态:f[i][j][k]表示取了第i行第j列取了k块的最大值 因为取了第i行第j列以后第i行前面j个砖块全部会被取掉,所以维护一个前缀和s[i][j]表示原创 2017-05-01 16:00:49 · 349 阅读 · 0 评论 -
数位DP——HDU6148 Valley Number
题面:hdu6148 比赛的时候调到快结束的时候才A掉。。。(我真是太弱了。。。 其实就是数位DP,状态也很简单: f[i][j][k]表示i位数字开头数字为j,当前状态为k的数量,k=1表明已经有过递增,k=0表明没有过递增。。。 然后先把f求出来之后直接统计答案就行了 还是很简单的。。。要是早调出来几分钟说不定文化衫就有了呢QAQ#include <cstdio>#include <algorit原创 2017-08-18 18:12:48 · 682 阅读 · 0 评论 -
循环矩乘——Luogu3746/BZOJ4870 [SHOI2017]组合数问题
题面:BZOJ4870 Luogu3746 第一次接触循环矩乘。。。 首先我们可以考虑DP,f[i][j]f[i][j]表示在i个物品中选取modkmodk下余j的方案数。 状态转移很好想,f[i][j]=f[i−1][j]+f[i−1][(j−1+k)modk]f[i][j]=f[i-1][j]+f[i-1][(j-1+k)mod k] 然后发现这个DP可以用矩乘优化,矩阵大概长这个样子:原创 2017-10-06 08:20:46 · 379 阅读 · 0 评论