随笔分类 -  DP

摘要:"题目" 因为该题需要求解方案数,因此我们不能用计数题的常用方法,即用递推来解决,类似于动态规划的思想。 我们用$dp[i][j][h][o]$表示第一个串枚举到了$i$,第二个串枚举到了$j$,$A$中取了$h$串,$o$表示选不选当前第i位的方案数。 可以得出以下的状态转移: 如果此位不选择的话 阅读全文
posted @ 2019-11-10 11:26 DAGGGGGGGGGGGG 阅读(209) 评论(0) 推荐(0)
摘要:"题目" 题意简化一下就是找题目给定的n个数最多能消掉多少个,我们用个tong[i]来记录i这个数值能不能用小于等于i的货币组合起来,等于1意味着他只能由自己本身的货币组成,等于2说明他可以被其他货币组成(此时的数不一定是货币,但等于2的货币不能要),最后只需要统计一下n个数里有几个tong等于1即 阅读全文
posted @ 2019-11-09 16:18 DAGGGGGGGGGGGG 阅读(195) 评论(0) 推荐(0)
摘要:"题目" $DP$ 设状态$dp[i]$为$i$位置放了斑点牛,前$i$个位置能得到的最多的牛。 有方程$dp[i]=max(dp[j]+1,dp[i])$,而我们并不知道什么$j$可以使$i$不在区间内 由于$i$位置放了牛,又因为$i$所在的区间只能放一个,$j$不能跟$i$同属于一个区间,又因 阅读全文
posted @ 2019-11-09 08:33 DAGGGGGGGGGGGG 阅读(184) 评论(0) 推荐(0)
摘要:"题目" 数位$DP$ 数位$DP$一般用于对满足一个什么条件的数的个数进行计数,且该数的数据范围很大的问题进行求解。这种题的状态一般都跟长度、限制条件、最高位上的数有关。 本题的状态为:$dp[i][j]$为长度为$i$的,最高位为$j$的$windy$数个数。 此状态有个非常简单的递推式,$dp 阅读全文
posted @ 2019-11-08 15:36 DAGGGGGGGGGGGG 阅读(171) 评论(0) 推荐(0)
摘要:"题目" 状压DP。 直接枚举二进制数表示当前猪有没有被消灭的状态。 最终答案的几条抛物线必定至少撞到一个猪。而且两头猪确定一条抛物线,可以枚举两头猪,分别求出他们的抛物线所消灭猪的状态,然后可以用类似背包的方法转移DP。 有方程: $dp[i|($当前抛物线的状态$)] = min(dp[i|($ 阅读全文
posted @ 2019-11-05 18:47 DAGGGGGGGGGGGG 阅读(150) 评论(0) 推荐(0)
摘要:"题目" 运用数学知识递推。定义$DP[i][j][k]$为前i行内选择j个列只有一个炮,k列只有两个炮的放置方案总数。 因为如果有一列或者一行的炮大于等于三时,必会有一个炮会被攻击到,所以可以用一个和两个来区分,方便递推。这样可以使的列里面的炮不会大于等于三,然后考虑行,这一行内只能放两个或一个, 阅读全文
posted @ 2019-11-03 20:53 DAGGGGGGGGGGGG 阅读(137) 评论(0) 推荐(0)
摘要:"题目" DP或者说是递推。 首先我们考虑一定要让吃饭慢的人排在前面,因为打饭的时间其实是固定的,所以首先要考虑吃饭慢的人先吃饭。然后再考虑两个窗口的问题。设置$dp[i][j]$为前i个人在1号窗口打饭时间为j时,所用的最小的结束时间。只需知道前i个人的打饭时间,即可推出前i个人在2号窗口打饭的时 阅读全文
posted @ 2019-10-31 18:14 DAGGGGGGGGGGGG 阅读(108) 评论(0) 推荐(0)
摘要:"题目" 有可以直接找$maxn[i][j][t]$为$(i,j)$为左下角长度为t的正方形内的最大值。 然后可以有以下转移: $maxn[i][j][t] = Max(maxn[i + 1][j][t 1], maxn[i][j][t 1], maxn[i][j + 1][t 1], maxn[i 阅读全文
posted @ 2019-10-29 11:48 DAGGGGGGGGGGGG 阅读(150) 评论(0) 推荐(0)
摘要:"题目" DP 此题可以分为两个子问题。 $m$等于$1$: 原题目转化为求一行数列里的$k$块区间的和,区间可以为空的值。 直接定义状态$dp[i][t]$表示前i个数分为t块的最大值。 因为区间可以为空,所以最大值再小也不会比0小,所以初始化$dp$值为$0$。 有方程$dp[i][t]=max 阅读全文
posted @ 2019-10-28 21:36 DAGGGGGGGGGGGG 阅读(146) 评论(0) 推荐(0)
摘要:"题目" DP,直接递推比记忆化搜索简单。 定义状态$dp[i][j]$为前i行最后一个选择第i行第j个数所得到最大值。 易得状态转移方程 $dp[i][j]=max(dp[i 1][k]+a[i][j])$ 这个题比较困难的就是在$j$和$k$的枚举上。$j$要满足选$j$的时候一定要比$i$大, 阅读全文
posted @ 2019-10-27 21:15 DAGGGGGGGGGGGG 阅读(190) 评论(0) 推荐(0)
摘要:"题目" 树形DP,定义状态$dp[i][j]$为$i$的子树保留$j$个节点,且i不连接父亲所需要删去的最小值。 初始化:$dp[i][1]$等于与$i$相连的边数,只需要保留一个节点且要和父亲断开,那只能是$i$这一个节点,其他跟i相连的节点都要断开。 有转移方程$dp[i][j]=min(dp 阅读全文
posted @ 2019-10-26 15:50 DAGGGGGGGGGGGG 阅读(186) 评论(0) 推荐(0)
摘要:"题目" 树形DP,首先考虑递归建图,类似于线段树的中序遍历。然后取状态dp[i][j]表示i点花费j时间所偷到的最多的画,有方程: $dp[now][nwt] = max(dp[now][nwt], dp[lso][i] + dp[rso][nwt i data[now].t]);$ 注意三点: 阅读全文
posted @ 2019-10-25 21:42 DAGGGGGGGGGGGG 阅读(160) 评论(0) 推荐(0)
摘要:"题目" 区间dp。但是跟平常的区间dp不同的是,这个题仅仅只是运用了区间dp的通过小区间的信息更新大区间的信息,而没有运用枚举断点的区间dp一般思路。 这个题我们首先发现每个人在插入的时候一定插入到队伍的最前方或最后方,所以当要插入该数的时候,要比较的数是队伍的最前方或最后方,然后用加法原理。与其 阅读全文
posted @ 2019-10-25 08:39 DAGGGGGGGGGGGG 阅读(118) 评论(0) 推荐(0)
摘要:"题目" 此题数据范围小的话可以用区间$DP$,但是该题目的数据范围并不能用区间DP来求解,因此我们考虑优化$DP$。 每个数的生成一定是由这两个区间 考虑区间DP的弊端是并不知道每个数生成的区间是什么,所以需要枚举,而这枚举的时间就浪费了。因此考虑以区间信息为状态,在找到区间信息里比较好转移的状态 阅读全文
posted @ 2019-10-22 10:22 DAGGGGGGGGGGGG 阅读(177) 评论(0) 推荐(0)
摘要:"题目" DP, 用的$dp[i][j]$表示$i$之前的数选了$j$个得到的最大结果,然后状态转移方程应该是 $$if (j \% t == 0)~~dp[i][j] = max(dp[i][j], max(dp[i 1][j] S[i], dp[i 1][j 1] + S[i] + B[i]) 阅读全文
posted @ 2019-10-21 10:05 DAGGGGGGGGGGGG 阅读(125) 评论(0) 推荐(0)
摘要:"题目" DP,需要注意边界上的问题。 状态定义$dp[i]$为句子第i位去除字母的最小值,答案就是$dp[len]$。 易得状态转移方程为: $$dp[i]=min(dp[i 1]+1,dp[l]+(i l len[j]))$$l是保留第j个字符串的右端点,len[j]是第j个字符串的长度。 c+ 阅读全文
posted @ 2019-10-20 20:39 DAGGGGGGGGGGGG 阅读(156) 评论(0) 推荐(0)
摘要:"题目" 一道非常好的树形DP。 状态:$dp[u][n]$为u的子树选n个黑点所能得到的收益最大值。 则最终的结果就是$dp[root][k],$$root$可以为任何值,为了方便,使$root=1$ 然后考虑怎么状态转移,状态转移一般要从方程和边界入手,考虑用背包的思想,得到方程: $$ dp[ 阅读全文
posted @ 2019-10-18 16:50 DAGGGGGGGGGGGG 阅读(245) 评论(1) 推荐(0)
摘要:"题目" 区间DP,将$maxn[i][j][k]$表示为i到j区间内分为k个区间所得到的最大值,$minn$表示最小值。 然后可以得到状态转移方程: $$maxn[i][j][k]= max(maxn[i][j][k],maxn[i][l][k 1] (l到j的\%10后的和))$$。 然后判断一 阅读全文
posted @ 2019-10-16 15:52 DAGGGGGGGGGGGG 阅读(133) 评论(0) 推荐(0)
摘要:"题目" dp状态定义的好题,初看这个题其实并不好想到他的状态,但是可以根据状态的定义,需要满足最优子结构。还有比较重要的一点就是方便转移方程。 首先我们定义dp[i]表示前i个数所能得到的最多个数,发现并不好转移,因此我们考虑多加一维状态j表示前i个数选j个的最多个数。这样就可以得出状态转移方程了 阅读全文
posted @ 2019-10-14 10:53 DAGGGGGGGGGGGG 阅读(159) 评论(0) 推荐(0)
摘要:"题目" 一道入门的dp,首先要先看懂题目要求。 容易得出状态$dp[i][j]$定义为i时间疲劳度为j所得到的最大距离 有两个坑点,首先疲劳到0仍然可以继续疲劳。 有第一个方程: $dp[i][0]=max(dp[i 1][0],d[i][0])$ 而如果要休息则一定要休息到疲劳值为0才可以停止。 阅读全文
posted @ 2019-10-13 09:53 DAGGGGGGGGGGGG 阅读(142) 评论(0) 推荐(0)