dp入门
文章平均质量分 61
动态规划
张小生的先生
你要觉得我博客还行,就点赞加个关注,有意深聊的可以私信,随时欢迎,当然有女性想深聊的我更欢迎,要是男性的话不建议私聊,我跟一大老爷们真聊不起来。我人品五五开,胆小不好色,对女性要求不高但要识大体,样貌看得过去就行,其它的也就那样了。我不仅把这个当作学习博客也当作一个招友的圣地,希望在这里遇见更好的你。
展开
-
[Codeforces Global Round 14] F. Phoenix and Earthquake (组合数学+打表逆元+dp)
题目链接:F. Phoenix and Earthquake题解我们考虑手动开灯情况,很明显就是一段段连续的1中间最多隔一个0。每个区间内灯被点亮的方案数为2len−1{2^{len-1}}2len−1个,(len为区间长度)。定义:设dp[i][j]:前i个灯有j个手动开,最后一个是手动打开的方案数。{设dp[i]}[j]:前i个灯有j个手动开,最后一个是手动打开的方案数。设dp[i][j]:前i个灯有j个手动开,最后一个是手动打开的方案数。初始化:dp[i][i]=2i−1{dp[i][i]=原创 2021-05-13 10:22:34 · 201 阅读 · 0 评论 -
[Codeforces Round #708 (Div. 2)] E2. Square-free division (hard version) (尺取预处理+dp)
题目链接:E2. Square-free division (hard version) 题解本题E1的解法是先把每个数的所有平方因子杨了(ec-final学了一手),然后判断当前数是否曾经出现过,如果出现则说明需要在此划分,否则继续向下遍历。但E2加了一个条件可以更改k个数。首先我们需要清楚一点,假如前i个数有两个重合的,那么我们通过更改重合的那个数是否一定能使前i个数不重合,或者是否能保证更改后也一定不和后面的数重合。E2的做法同样是先把平方因子杨了,所以假如重合了,更改后的那个数把平方因子杨原创 2021-04-27 21:46:42 · 162 阅读 · 0 评论 -
[Codeforces Round #717 (Div. 2)] D.Cut (倍增)
题目链接:D. Cut题意给一个长度为n的数组,有q次查询,每次查询给定一个区间[l,r],问该区间能至少划分成多少个连续子区间使得子区间里的数两两互质。题解我们首先可以预处理得到以每个点x作为右端点向左划分一个子区间时的左端点的下标f[x]。用dp[i][j]{dp[i][j]}dp[i][j]表示以j为区间右端点向左划分2^i个子区间后的左端点下标初始化:dp[0][x]=f[x]{dp[0][x]=f[x]}dp[0][x]=f[x]转移方程:dp[i][j]=dp[i−1][dp[i−原创 2021-04-24 22:16:45 · 208 阅读 · 0 评论 -
[Codeforces Round #717 (Div. 2)] C. Baby Ehab Partitions Again (01背包+思维)
题目链接:C. Baby Ehab Partitions Again题解用dp判断一开始是否需要删除数字,如果需要,我们只需删除最低位为1的那个数即可。貌似许多人2e9的时间复杂度也能过,就离谱。代码int a[maxn],sum;int dp[maxm];int book[maxn],n;vector<int> p;bool f(){ memset(dp, 0, sizeof(dp)); p.clear(); sum=0; dp[0]=1; for(int i=1原创 2021-04-23 12:19:17 · 231 阅读 · 0 评论 -
[leetcode] 115. 不同的子序列(dp入门)
题目链接:115. 不同的子序列题解n=len(s),m=len(t)定义dp[i][j]:字符串(s[i]~s[n-1]) 的子字符串中与字符串t[j]~t[m-1]匹配的个数。初始化dp[i][m]:字符串t从0开始,所以t[m]为空,任意字符串的子字符串都能与空串匹配,即dp[i][m]=1dp[n][i]:同理,空串不与非空字符串t匹配,所以dp[n][i]=0状态转移s[i]==s[j]:dp[i][j]=dp[i+1][j+1]+dp[i+1][j]s[i]!=s[j]:d原创 2021-03-22 20:29:41 · 133 阅读 · 0 评论 -
[leetcode] 712. 两个字符串的最小ASCII删除和 (dp入门)
题目链接:712. 两个字符串的最小ASCII删除和题解定义:dp[i][j]:s1[i]到结尾与s2[j]到结尾的两个字符串匹配所需删除最小ASCII码的和{dp[i][j]:s1[i]到结尾与s2[j]到结尾的两个字符串匹配所需删除最小ASCII码的和}dp[i][j]:s1[i]到结尾与s2[j]到结尾的两个字符串匹配所需删除最小ASCII码的和初始化:如果s1[i]到结尾的字符串(即i=len(s1))为空,那么dp[n][j]=(s2[j]到结尾字符串的所有字符ASCII的和),dp[i][原创 2021-03-19 23:16:08 · 127 阅读 · 0 评论 -
[Gym - 102861A] A - Sticker Album 概率dp
题目链接:A - Sticker Album题意给你一个容量为n的卡牌收集册,以及无限个卡牌包,卡牌包有[a,b]个卡牌,取出的卡牌数是等概率分布的,言外之意你有1b−a+1{\frac{1}{b-a+1}}b−a+11的概率取出a、a+1、…、b张卡牌。问你把卡牌收集册集满时的概率期望是多少。题解设dp[i]:你已经有i张卡牌,你要集满n张还需多少卡牌。状态转移:dp[i]=(dp[i+a]+1)+(dp[i+a+1]+1)+....(dp[i+b]+1)b−a+1{dp[i]=\frac{原创 2020-12-08 17:50:18 · 504 阅读 · 0 评论 -
[第十一届蓝桥杯国A] C:本质上升序列 动态规划
【问题描述】在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。例如,在字符串 lanqiao 中,如果取出字符 n 和 q,则 nq 组成一个单调递增子序列。类似的单调递增子序列还有 lnq、i、ano 等等。小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第二个字符和最后一个字符可以取到 ao,取最后两个字符也可以取到 ao。小蓝认为他们并没有本质不同。对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个原创 2020-11-29 13:01:28 · 739 阅读 · 0 评论 -
[saikr] 我去前面探探路 树型dp
题目链接:我去前面探探路由题意我们首先可以定义三种状态dp[u][0]:u节点不放装置时,以该节点为根节点的子树被覆盖所需最小话费。dp[u][1]:u节点放装置1,以该节点为根的子树被覆盖所需最小话费。dp[u][2]:u节点放装置2,以该节点为根的子树被覆盖所需最小话费。那么状态转移很容易想到如果根节点不放装置,子节点为根节点的树已经被全覆盖的情况下,如何向上递推使根节点与该子节点所连的边被覆盖。很明显子节点必须放装置1或2。dp[u][0]+=min(dp[v][1],dp[v][2])原创 2020-11-23 23:18:52 · 352 阅读 · 0 评论 -
[UVA - 1220] Party at Hali-Bula 树上dp
题目链接:Party at Hali-Bula 题意转化过来就是树的最大独立集问题,不过多了一个要求判断唯一性。题解经典树上dp问题1.dp定义d[u][0]和f[u][0]:不选u点能得到最大人数以及方案的唯一性。( f[u][0]=1表示唯一,0表示不唯一 )d[u][1]和f[u][1]:选择u点能得到最大人数以及方案的唯一性。2. 状态转移(1) d(u,1)=sum{d(v,0)} (v是u的儿子节点集合) 。如果有一个f(v,0)是0,那么f(u,0)为0.(2) d(原创 2020-11-16 21:08:37 · 115 阅读 · 0 评论 -
[牛客练习赛69] D. 火柴排队 多维dp+逆元+递推求排列组合
题目链接:火柴排队题意给你长度为n的序列a,随即使得k个元素增加d,求增加后的序列ai′{a_i'}ai′满足:如果ai<aj,那么ai′<aj′{a_i<a_j,那么a_i'<a_j'}ai<aj,那么ai′<aj′的概率为多少。对于每个1≤K≤n,你要输出每个答案并对998244353取模。题解本题发现n≤5000,并且每个状态都和前一个状态有关系,所以我们可以尝试用dp求解。分析本题,对序列的顺序并无要求,所以可以先对序列排序,这样对一个元素加d原创 2020-09-12 21:36:48 · 188 阅读 · 0 评论 -
[超级码力在线编程大赛初赛(三)] 房屋染色 前缀和+多维dp
题目链接:房屋染色题意我简化一下题意,给你一个n*k的矩阵,我们从每一行选取一个数使得n行选取这n个数之和最小,对于选取有一个限制,如果连续行选取的数在同一列,最多取t行,剩下相邻的行不能取同一列的数,问最小值是多少。题解由题意得,1≤n,k≤100,本题貌似没有什么贪心策略,看来只能优雅的暴力dp登场了。很明显dp需要三维才能符合本题的操作。定义:dp[i][j][k]:前i行,最后一行选取第j列,此时符合k情况时最小值。(k有两种情况,0代表没有出现连续行选取同一列,1代表已经在连续行选取原创 2020-09-07 22:02:22 · 152 阅读 · 0 评论 -
2020牛客暑期多校训练营(第三场) E.Two Matchings 构造+dp
题目链接:Two Matchings题意让你构造两个序长为n,列p,q,这两个序列各个位都不相同,并且满足pi≠i且ppi=i{p_i≠i 且p_{p_i} =i}pi=i且ppi=i。给你一个序列a,可以计算一个值(∑i=1nabs(ai−api))/2{(\sum_{i=1}^{n}abs(a_i-a_{p_i}))/2}(∑i=1nabs(ai−api))/2,找符合条件的p、q中,计算值之和最小的是多少。题解本题先来分析p、q序列,题目中给出pi≠i且ppi=i{p_i≠i原创 2020-09-04 16:23:17 · 142 阅读 · 0 评论 -
[超级码力在线编程大赛初赛(一)] 3.大楼间穿梭 dp入门+单调栈
题目链接:大楼间穿梭题意给你一个长度为n的序列,你现在处在下标为1的点,你现在有两个操作向右边行走。花费x点体力,移动到右侧k幢建筑中第一栋大于等于当前位置值的点。花费y点体力,向右移动一步或者两步。问最少花费多少体力才能才能到达最后一个位置上的点。题解本题很明显不存在贪心策略使得答案最优,所以这时就需要优雅的暴力dp来帮助我们解决此类问题了。本题的状态定义和转移很容易定义。dp[i]:移动到位置i时最少需要多少体力。那么转态转移由题意得:dp[i]=min(dp[i],min(d原创 2020-08-29 22:22:49 · 278 阅读 · 0 评论 -
[超级码力在线编程大赛初赛(一)] 4.对称前后缀 dp处理回文串
题目链接:对称前后缀题意给定一个字符串s。 我们令一个字符串的权值为一个字符串的最长对称前后缀长度。 请求出s的所有子串的权值的总和。 例如,“abcxyzcba” 的最长对称前后缀的长度为3,因为 “abc” 和 “cba” 对称。(注意前后缀也可以是字符串本身)题解题中给出n≤3∗103n≤{3*10^{3}}n≤3∗103,并且和回文串有关,想到可以尝试用dp找字符串中最长对称前后缀。记得前几天写过一个类似相关的题目:Partitioning by Palindromes,是dp预处理找回文原创 2020-08-29 21:51:48 · 268 阅读 · 0 评论 -
[牛客算法竞赛入门课第六节习题] 取数游戏2 dp入门
题目链接 :取数游戏2题意给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax{a_x}ax,则第i次取走的数的价值vi=bi⋅ax{v_i=b_i⋅a_x}vi=bi⋅ax,现在希望你求出∑vi{∑v_i}∑vi的最大值。题解分析本题,很容易发现每一步的最优解是无法得到整体最优解,所以需要通过需求一种优雅的“暴力”来解决本题。由于本题每次只能从最左端和最右端取数字,那么我们可以枚举左右两端取了多少数字来得出结果。设dp[i][j]:左边取原创 2020-08-28 18:05:12 · 429 阅读 · 0 评论 -
[Educational Codeforces Round 94] D. Zigzags dp预处理+枚举
题目链接:D. Zigzags题意给你一个长度为n的序列a,让你找符合条件的四元组有多少个。四元组(i,j,k,l),其中1≤i<j<k<l≤n{1≤i<j<k<l≤n}1≤i<j<k<l≤n,并且a[i]=a[k],a[j]=a[l]{a[i]=a[k],a[j]=a[l]}a[i]=a[k],a[j]=a[l]。题解本题一开始难以入手,不知如何枚举。其实我们可以尝试一下如果枚举i和j,a[k]和a[l]的大小确定了,但是位置无法确定,k原创 2020-08-26 20:36:48 · 227 阅读 · 0 评论 -
[2019CCPC-江西省赛] D - Wave 暴力/dp
题目链接:D - Wave 题意给你一个长度为n的字符串,字符串只包含1~c数字,让你找一个子字符串要求子字符串的奇数位为一个数,偶数位为一个数并且奇数位和偶数位不同。题解本题有一个关键点c≤100,很明显我们可以通过枚举奇数位和偶数位的数字来得到答案。当奇数位为i,偶数位为j时,我们可以先统计哪些位置的数字为i,哪些位置的数字为j。然后不断二分去扩展长度,如果无法二分,那么就停止扩展。这是暴力解法,时间复杂度为O(c2log(n)){O(c^2log(n))}O(c2log(n))当然这道题也原创 2020-08-24 15:14:49 · 241 阅读 · 0 评论 -
[UVA - 11584] Partitioning by Palindromes dp预处理回文串+dp入门
s原创 2020-08-23 12:10:40 · 144 阅读 · 0 评论 -
[牛客算法竞赛入门课第六节习题] 合并回文子串 多维dp
题目链接:合并回文子串题意给你两个字符串a,b,合并成一个串c,属于A和B的字符在C中顺序保持不变。问字符串C中最长回文子串的长度是多少。题解本题有一个关键点字符串长度不超过50,我们想到可以用dp去解决,dp不就是优雅的暴力嘛。^_^我们可以想到dp的定义dp[i][j][k][l]:a串中i~j子字符串与b串中k~l子字符串合并,能否组成一个回文串。1代表可以,0代表不行。{ dp[i][j][k][l]:a串中i~j子字符串与b串中k~l子字符串合并,能否组成一个回文串。1代表可以,0代表原创 2020-08-23 10:55:48 · 221 阅读 · 0 评论 -
[2020牛客算法竞赛入门课第九节习题] 小魂和他的数列 离散化+树状数组+dp优化
题目链接:小魂和他的数列题意给你一个长度为n的数列a,问数列一共有多少个长度为K的子序列是严格递增的。题解题目有个关键信息:1≤n≤500000,1≤k≤10。看到k这么小我首先想到的是能否用dp去解决,不出所料,感觉还真可以。定义dp[i][j] :以i结尾,长度为j严格递增的子序列有多少种。状态转移:dp[a[k]][j]=∑i=1i<a[k]dp[i][j−1]{dp[a[k]][j]=\sum_{i=1}^{i<a[k]}dp[i][j-1]}dp[a[k]][j]=∑i=原创 2020-08-22 14:00:34 · 241 阅读 · 0 评论 -
[2020牛客算法竞赛入门课第九节习题] 小翔和泰拉瑞亚 线段树+dp优化
题目链接:小翔和泰拉瑞亚题意给你一个长度为n的序列和m个操作,每个操作中,你要将li~ri{l_i~r_i}li~ri区间内每个数减少wi{w_i}wi。你可以从这m个操作中选择一部分,使得该序列(最大数-最小数)最大。题解本题一开始是毫无头绪的,如何选成了难题?但是有一个思路却让我柳暗花明,就是把第i个数当作最小值,那么很容易我们可以想到把所有能减小第i个数的区间都算进去一定能得到最优子结构的解。如果减小第i个数的区间不包含最大值,那么答案更优;如果包含,最大最小同时减对答案没有影响。原创 2020-08-22 12:03:50 · 267 阅读 · 0 评论 -
最长上升子序列LIS板子 O(nlogn)
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<cstdlib>#include<ctime>#include<deque>原创 2020-08-19 22:22:32 · 243 阅读 · 0 评论 -
[ BAPC 2016 ] Hamming Ellipses 动态规划
题目链接:Hamming Ellipses题意给你两个长度为n只包含 [0~q-1] 的字符串s1,s2,定义一个汉明距离:一个新的字符串s3每个字符s3[i]与s1[i],s2[i]不同的个数之和。现在给定一个汉明距离d,问能构造多少个s3使得其与s1,s2的汉明距离为d。题解一开始用组合数学的方法去想,但由于情况有点复杂就放弃了。题中发现(d≤2n,n≤100)发现能用动态规划去求解。定义dp[i][j]:以i结尾汉明距离为j的字符串有几种。状态转移s[i]==s2[i]:dp[i][原创 2020-08-18 14:20:16 · 283 阅读 · 0 评论 -
Codeforces Round #662 (Div. 2) D. Rarity and New Dress
题目链接:D. Rarity and New Dress昨天集训队一名同学在做这道题,为了给他增加信心,我说这题很简单,随便做做就过了,然后今天看了这道题,一下午没写出代码。。。emmm,只想在这对那位同学说声抱歉。题意给你一个n*m的网格,每个点有一个字母代表一种颜色,题目构造了一种图案——正菱形图案,图案内的颜色必须相同,单个字符也算一个正菱形。问你在网格中符合条件的图案有多少个?题解首先我们来分析这道题,正菱形可以分为上三角形和下三角形,我们以格子的每个点为菱形中心,那么它对答案的贡献值为原创 2020-08-11 21:59:22 · 189 阅读 · 0 评论 -
Codeforces Round #663 (Div. 2) C. Cyclic Permutations
题目链接:C. Cyclic Permutations题意给你一个数n,让你寻找1~n的全排列中满足以下条件的排列有多少种。一个排列中,我们可以将一个数左边第一个大于它的数的序号和该数序号连接,也可以将右边第一个大于它的数的序号和该数连接,如果没有这种数就不连接。对每个数操作完后,形成一个无向图,如果无向图有环则满足条件,无环则不满足。题解首先通过分析我们可以知道当1在中间时必满足条件。以a、1、b为例,设1的序号为x,则a的序号为x-1,b的序号为x+1。可知(x,x+1)和(x,x-1)这原创 2020-08-11 14:56:41 · 347 阅读 · 0 评论 -
[2020牛客算法竞赛入门课第六节习题] 简单瞎搞题 bitset+简单dp
题目链接:简单瞎搞题题意给你n个区间,每次我们从一个区间l[i]~r[i]{l[i]~r[i]}l[i]~r[i]取一个数,然后从n个区间取n个数后,取s=∑i=1nxi2{s=\sum_{i=1}^{n}x_i^2}s=∑i=1nxi2,问s的情况有多少种。题解一开始当作正常dp求解,设dp[i][j]:已经取了前i个区间后答案为j的个数。状态转移方程为:dp[i][j]+=dp[i-1][j-k*k] , (k为从第i个区间选的数字)然后答案无非最大为100∗1002{100*100^2原创 2020-08-05 22:11:29 · 455 阅读 · 1 评论 -
[2020牛客暑期多校训练营第五场] D. Drop Voicing 思维+LIS
题目链接:D.Drop Voicing这个题多亏队友的思路才让我醍醐灌顶,有解可寻。题意给你n个数的一种排列,对这个数列有两种操作。[第一种] Drop-2:把第二高位移到最低位,如pn−1,p1,p2,.....,pn−2,pn{把第二高位移到最低位,如p_{n-1},p_1,p_2,.....,p_{n-2},p_{n}}把第二高位移到最低位,如pn−1,p1,p2,.....,pn−2,pn[第二种] Invert:把最低位移到最高位,如p2,p3,.....,pn−1,pn,p原创 2020-07-29 10:01:06 · 145 阅读 · 0 评论 -
[2020年牛客算法入门课练习赛2] 迁徙过程中的河流
迁徙过程中的河流题解:经典dp题,那么状态如何表示,状态如何转移?很容易想到dp[i]:前i个人全部过河需要的时长。那么状态如何转移?将过河时间从小到大进行排序其实样例中已经给了一种转移方法,由dp[i-2]转移而来,当前(i-2)个人已经全部到河对岸,第1个人将船从河对岸开过来花费a[1],然后第(i-1)个人和 第i个人 一起乘船到河对岸用时a[i],然后第2个人从河对岸把船开回来接第1个人,开过来用时a[2],开过去又花费a[2]。dp[i]=dp[i-2]+a[1]+a[i]+a[2原创 2020-06-18 00:08:09 · 276 阅读 · 0 评论 -
[2020年牛客算法入门课练习赛2] 古老的牛市,遗迹的天梯
古老的牛市,遗迹的天梯题解:这个台阶的题一看受制于前面台阶的影响,并且不同的选择都有可能造成最优结果,不像贪心那样“单纯”,那么很可能用动态规划去搞。那么状态如何定义?状态如何转移?成为解决动态规划的关键。由于本题题目信息不复杂,无非上下台阶问题,所以很容易想到状态表示。dp[i]:到第i个台阶至少需要多少步。第i个台阶无非由两种状态转移由第i-1台阶直接走到,如果h[i-1]+1==h[i],那么dp[i]=dp[i-1]+1由前一部分第j个台阶跳跃得到,那么问题来了,前一部分第j个台阶指原创 2020-06-15 23:09:13 · 188 阅读 · 0 评论 -
牛客算法入门课练习赛2 : 牛牛的旅游纪念品
牛牛的旅游纪念品题解:这个题如果没有对位置的限制,就可以贪心取前m大的数即可。但本题的关键在于**买的m个物品中任意两个的位置差都大于等于k。**那么贪心的方法显而易见行不通,很容易联想到用动态规划取搞。那么它的状态如何表示?状态转移方程怎么写?由题可知本题有两个状态,n个物品以及取走m个物品,并且对物品的位置有着限制,那么我们可以定义dp[i][j]:前j个物品取i个的欢迎程度dp[i][j]无非由两种状态转移而来没有买第j个物品,那么dp[i][j]=dp[i][j-1]。买了第j个物品原创 2020-06-15 21:11:56 · 392 阅读 · 0 评论