随笔分类 -  动态规划-DP

摘要:"题目链接" 简单区间dp 令$f[i][j]$表示$[i,j]$的最短长度 先枚举区间,然后在区间中枚举长度$k$,看这个区间能不能折叠成几个长度为$k$的,如果能就更新答案。 cpp include include include using namespace std; char s[110] 阅读全文
posted @ 2019-10-05 09:15 Qihoo360 阅读(150) 评论(0) 推荐(0)
摘要:"题目链接" 手写一下AC自动机(我可没说我之前不是手写的) Trie上dp,每个点的贡献加上所有是他后缀的串的贡献,也就是这个点到根的fail链的和。 cpp include include include include using namespace std; const int MAXK = 阅读全文
posted @ 2019-05-24 15:53 Qihoo360 阅读(193) 评论(0) 推荐(0)
摘要:"题目链接" 首先想到状压dp,但是$n,m$高达100,怎么压? 容易发现,每行每列最多两个象棋,否则就直接gg了。 一个巧妙的设置状态的方式是,只需要记录到当前行有多少列是放了1个炮和2个炮。 然后每一行有3种选择:不放、放1个、放2个。分情况转移就行了。 cpp include const i 阅读全文
posted @ 2019-05-24 15:08 Qihoo360 阅读(198) 评论(0) 推荐(0)
摘要:"题目链接" $f[i][j]$表示准考证号到第$i$位,不吉利数字匹配到第$j$位的方案数。 答案显然是$\sum_{i=0}^{m 1}f[n][i]$ $f[i][j]=\sum_{k=1}^{m 1}f[i 1][k] g[k][j]$ $g[i][j]$表示不吉利数字匹配到第$i$位后加一 阅读全文
posted @ 2019-05-24 09:34 Qihoo360 阅读(445) 评论(0) 推荐(0)
摘要:"题目链接" AC自动机上dp第一题嗷。 如果直接求可读文本的数量,显然要容斥,不好搞。 于是考虑求不可读文本的数量,再用$26^m$减去其即可。 建出AC自动机,如果一个节点为单词结尾或其fail链中有节点为单词结尾,那么这个点就不能走,这个显然可以在bfs的时候顺便求出来。 然后就是大家熟知的方 阅读全文
posted @ 2019-05-18 10:37 Qihoo360 阅读(229) 评论(1) 推荐(0)
摘要:"题目链接" $g[i][j]$表示不走在$i\text{~}j$时间段中会关闭的港口(哪怕只关$1$天)从$1$到$m$的最短路。 $f[i]$表示前$i$天的最小花费。于是有: $$f[i]=\min_{j=0}^{i 1}[f[j]+g[i][j] (i j)+k]$$ 就是枚举在哪天改计划。 阅读全文
posted @ 2019-01-27 12:03 Qihoo360 阅读(141) 评论(0) 推荐(0)
摘要:"题目链接" 第四题。 初看题目很懵,~~网络流这么厉害的吗,~~毫无头绪去看题解。。 所以这和网络流有什么关系呢? 把规则用二进制保存下来,然后跑最短路救星了。 在线跑,离线连边太慢了。 (以后干脆不管什么题直接开100W,Re变成Wa调了我好久 阅读全文
posted @ 2018-12-20 20:25 Qihoo360 阅读(130) 评论(1) 推荐(0)
摘要:"题目链接" 这种求方案数的题一般都是$dp$吧。 注意到范围里$k$和$n$的范围一样大,$k$是完全可以更大的,到$n$的平方级别,所以这暗示了我们要把$k$写到状态里。 $f[i][j]$表示前$1$~$i$的排列逆序对数为$j$的方案数。 现在考虑把$i$插入到$i 1$的排列里。 $i$肯 阅读全文
posted @ 2018-11-03 17:06 Qihoo360 阅读(183) 评论(0) 推荐(0)
摘要:"题目链接" ~~位运算+$DP$=状压$DP$?(雾~~ $a\&b =min(a,b)$在集合的意义上就是$a\subseteq b$ 所以对每个数的子集向子集连一条边,然后答案就是这个$DAG$的最长链了,跑一遍拓扑排序就行了。 直接连边的复杂度是$O(n^2)$,显然只能拿$60'$。 题解 阅读全文
posted @ 2018-10-23 10:09 Qihoo360 阅读(184) 评论(0) 推荐(0)
摘要:"题目链接" ~~毒瘤DP题~~ 因为$(i,j)$能不能敲取决于$(i 1,j)$和$(i 1,j+1)$,所以一行一行地转移显然是有后效性的。 于是考虑从列入手。我们把这个三角形“左对齐”,变成一个直角三角形。 第$i$列第$j$个要取,则第$i$列前$j 1$个和第$i+1$列前$j 1$个肯 阅读全文
posted @ 2018-09-20 16:44 Qihoo360 阅读(138) 评论(1) 推荐(0)
摘要:"题目链接" 题意:$n$个木块放到两个塔里,每个木块可放可不放,使得两塔高度相同且高度最大,求最大高度。 这个差值$DP$的思维难度还是很大的,没想出来,我就打了一个$dfs$骗了好像$20$还是$30$分吧(看来搜索也写挂)。 正解是$DP$,$f[i][j]$表示前$i$块木块使得两个塔的高度 阅读全文
posted @ 2018-09-17 08:02 Qihoo360 阅读(392) 评论(0) 推荐(0)
摘要:"题目链接" 这题还是很好想的,看到$90%$的数据点时,我就知道要用$n^3$的算法~~(最后10分就算了吧)~~ 然后,数据水,直接暴力$n^3$卡过了。 显然是道DP。 设$f[i]$表示第$i$秒获取到的最多的金币。 三重循环更新状态。 第一重枚举机器人出发时间, 第二重枚举机器人出发地点, 阅读全文
posted @ 2018-09-13 11:19 Qihoo360 阅读(181) 评论(0) 推荐(0)
摘要:"题目链接" 题意:给定一个$n\times m$的矩阵,每次可以向→↓←移动一格,也可以原地不动,求从$(x,y)$到最后一行的期望步数。 ~~此题标签$DP$~~ ~~看到上面这个肯定会想到~~ 方法一: $f[i][j]$表示表示从$(x,y)$走到$(i,j)$的期望步数,正推 方法二: $ 阅读全文
posted @ 2018-09-07 20:08 Qihoo360 阅读(663) 评论(3) 推荐(0)
摘要:"题目链接" 先考虑如果只有一天,那么该怎么做。 设$f[i][j][1]$表示前$i$个小时睡了$j$个小时并且第$j$个小时正在睡觉时的最大体力,$f[i][j][1]$表示前$i$个小时睡了$j$个小时并且第$j$个小时没在睡觉时的最大体力。 则有 $$f[i][j][0]=max(f[i 1 阅读全文
posted @ 2018-08-31 17:06 Qihoo360 阅读(270) 评论(1) 推荐(0)
摘要:裸DP。感觉楼下的好复杂,我来补充一个易懂的题解。 f[i][0]表示走完第i行且停在第i行的左端点最少用的步数 f[i][1]同理,停在右端点的最少步数。 那么转移就很简单了,走完当前行且停到左端点,那么一定是从右端点过来的,那么从上一行左端点转移的话就是 f[i][0]=abs(上一行左端点的坐 阅读全文
posted @ 2018-08-13 15:16 Qihoo360 阅读(160) 评论(0) 推荐(0)

You're powerful!