
动态规划
文章平均质量分 88
Happig丶
我的孤独,虽败犹荣
展开
-
Codeforces1729 G. Cut Substrings(线性DP)
它左侧和右侧可能存在多个和它相交的子串,为了尽可能的减少替换次数,但是只能覆盖其中一侧而无法兼顾左右,这一点容易证明。考虑去覆盖它以及它右侧和它相交的所有子串,那么需要在区间。答案应该从整个字符串的最后一个交错段中找,为了方便可以添加一个终点,终点从最后一个交错段转移而来,因此最终需要将这种方式得到的答案减一。因为状态转移是按交错段进行的,正常来说应该对整个字符串的第一个交错段全部初始化为。中的任何一个子串时,这段连续多个交错的子串可以全部被覆盖,下文将简称这段交错子串为交错段。,以及有多少种替换方案。原创 2022-10-12 20:11:12 · 688 阅读 · 0 评论 -
洛谷 P1108 低价购买(LIS统计方案数)
传送门题目大意求出最长下降子序列的长度以及有多少种不同的最长下降子序列(这里不同指的是某个位置的数不同即可认为不同)解题思路观察数据范围,只需要 O(n2)O(n^2)O(n2) 的做法,但是更快的做法好像没有。如果没有最长下降子序列种类的限制,可以设 d[i],f[i]d[i],f[i]d[i],f[i] 分别代表以位置 iii 结尾的最长下降子序列的长度和在这个长度下的个数,那么显然需要先求出 d[i]d[i]d[i],然后扫一遍更新 f[i]f[i]f[i]:f[i]=max(∑j=1i原创 2021-11-24 09:25:28 · 195 阅读 · 0 评论 -
洛谷 P1020 [NOIP1999 普及组] 导弹拦截(LIS+Dilworth定理)
传送门题目大意给定一个序列,求出最长不升子序列的长度以及原序列最少分为多少个不升的子序列。解题思路Dilworth定理在有穷偏序集中,任何反链最大元素数目等于任何将集合到链的划分中链的最小数目。偏序集的两个定理定理一:令(X,≤X,\leqX,≤)是一个有限偏序集,并令 rrr 是其最大链的大小。则 XXX 可以被划分成 rrr 个但不能再少的反链。其对偶定理称为 Dilworth 定理。定理二:令($X, \leq $)是一个有限偏序集,并令 mmm 是反链的最大的大小。则 XXX 可原创 2021-11-23 10:11:08 · 425 阅读 · 0 评论 -
洛谷 P1990 覆盖墙壁(DP/递推)
传送门题目大意给出一个2∗n(1≤n≤1e6)2*n(1 \leq n \leq 1e6)2∗n(1≤n≤1e6)的墙壁,规定只能用两种可以任意旋转的砖头覆盖,砖头的形状如下:求使用这两种砖头覆盖墙壁的方案数对100001000010000取模的结果。解题思路这种题目主要是推出递推式,虽然是二维的,但是定义状态时仍可以定义f[i]f[i]f[i]表示填充满前面的2∗i2*i2∗i个格子的方案数,假设当前要填第iii列,那么可以尝试一些放置方法,然后从前面已经得出的答案中递推求出:假设竖着放原创 2021-05-05 12:02:18 · 934 阅读 · 3 评论 -
数位DP入门总结
数位DP数位DP的问题一般是统计一个范围内满足数位存在某些约束的数的个数,例如数位中含有连续的两位是131313、数位和被某个数整除、该数本身被某个数整除、二进制1的个数大于等于0的个数等等。数位DP一般使用记忆化搜索(因为记忆化搜索比较简单),核心思想是:从高位向低位枚举第pospospos位,当前的状态为 statusstatusstatus,枚举这一位放置的数字,那么状态转移就是d(pos,status)=∑d(pos−1,status′)d(pos,status) = \sum{d(pos-1原创 2021-03-30 16:49:24 · 364 阅读 · 0 评论 -
洛谷 P1890 gcd区间(DP/线段树)
题目链接首先做这道题要明白gcd的一个重要性质,即gcd区间具有可加性。假设我们对三个数求gcd,gcd(a,b,c)=gcd( gcd(a,b),c ) = gcd( gcd(b,c),a )本题应该有三种具体方法:线段树,ST表,DP。蒟蒻博主还不会ST表,于是就写了另外两种方法DP我们用一个二维数组ans[i][j] 表示区间 [i,j] 的gcd,由上述性质我们可以得出这样一个递推...原创 2020-02-03 21:06:02 · 421 阅读 · 1 评论 -
ST表——RMQ区间最值查询
RMQ所谓RMQ(Range Maximum/Minimum Query),即区间最值查询问题。该问题的解决方法有线段树,ST表等等。对于静态的RMQ,ST表是最佳的选择,但是ST表无法解决动态的区间最值Sparse Table初始化设数组a是所求的序列,dp[ i ] [ j ]表示从第i个数开始连续2j个数的最小值。刚开始dp[ i ][ 0 ] 初始化为a[ i ],因为2j一定是偶...原创 2020-03-22 21:47:27 · 1036 阅读 · 0 评论 -
HDU - 6806 Equal Sentences(dp)
传送门挺容易看出来的dp,我们可以将问题简化为从第二个字符串开始,是否和前一个字符串交换位置,那么不难得出如下状态定义:设d[i][0/1]d[i][0/1]d[i][0/1]表示到第iii个字符串和前一个交换/不交换的字符串排列个数,那么状态转移方程为:d[i][0]=d[i−1][0]+d[i−1][1]d[i][0]=d[i-1][0]+d[i-1][1]d[i][0]=d[i−1][0]+d[i−1][1]d[i][0]=(s[i]==s[i−1]?0:d[i−1][0])d[i][0]原创 2020-08-01 22:24:57 · 272 阅读 · 0 评论 -
洛谷P1725 琪露诺(单调队列+dp)
传送门设d[i]d[i]d[i]表示跳到位置iii的最小值,那么不难想到状态转移方程为:d[i]=max{d[i−j]}+a[i],i−r≤j≤i−ld[i]=max\{d[i-j]\}+a[i],i-r\leq j \leq i-ld[i]=max{d[i−j]}+a[i],i−r≤j≤i−l本题可以写填表法,但是显然刷表法(由当前状态更新未来状态)更好。因为区间[i−r,i−l][i-r,i-l][i−r,i−l]长度是固定的,那么我们可以使用单调队列O(1)O(1)O(1)取得最值,这时来了一原创 2020-07-31 19:13:05 · 336 阅读 · 0 评论 -
Codeforces Round #641 (Div. 2) B. Orac and Models(dp+因数分解)
传送门设d(i)为长度为i时,长度最长的合法序列显然d(i)=max{ d(j) | j是i的因数 },边界为每个d(i)初始化为1那么我们对每个i因数分解即可,时间复杂度O(n3/2)#include <set>#include <map>#include <stack>#include <queue>#include <math.h>#include <cstdio>#include <string>原创 2020-05-14 18:01:48 · 230 阅读 · 1 评论 -
最长公共子序列——LCS
最长公共子序列给出两个子序列A和B,求长度最大的公共子序列。如1,5,2,6,8,7和2,3,5,6,9,8,4的最长公共子序列是5,6,8或2,6,8,长度均为3求LCS长度设dp(i,j)为a数组以i结尾,b数组以j结尾的最长公共子序列长度状态转移:如果a[i]==a[j],符合最长公共子序列的要求,那么就从i和j的前一个状态转移过来,即d(i,j)=d(i-1,j-1)+1如果a[i]!=a[j],那么状态可能从{ [1,i-1], [1,j] }或者{ [1,i], [1,原创 2020-05-10 18:03:02 · 164 阅读 · 0 评论 -
最长上升子序列LIS
问题引入给定n个整数a1,a2,a3,…,an,按从左到右的顺序选出尽量多的整数,组成一个严格上升子序列,求可以选出序列最长的长度动态规划设d(i)为以i结尾的最长上升子序列的长度,则d(i) = max{ d(i), d(j)+1(1<=j<i && a[j]<a[i]) }显然最终答案是max{ d(1),d(2),…,d(i) }时间复杂度O(n2)PS:如果需要求最长不下降子序列,改为a[j]<=a[i]即可int a[maxn],d[max原创 2020-05-10 10:49:26 · 337 阅读 · 1 评论