随笔分类 - 0x30线性dp
摘要:题目链接 #题目大意 给一个字符串问这个字符串k个不同子串和的最小值。 #解题思路 很明显算出来空串的个数,长度为1的不同子串的个数,长度为2的不同子串的个数...长度为n的不同子串的个数,然后就可以计算出答案了。 长度为m的不同子串,即从n个字符里头选m个字符的不同选法,即C(n, m),等等,如
阅读全文
摘要:题目链接 #题目大意 给你一个字符串s和一个字符串t,问s中是否存在两个不重叠的子序列能首尾拼接构成t。 #解题思路 很容易想到一个n4的方法,枚举t的拆分的位置,然后dp[i][j]表示前一半匹配i个,后一半匹配j个时需要的长度,如果最后没法构成两个子序列,就表示这个方案不可行。枚举拆分的位置
阅读全文
摘要:题目链接 #题目大意 给你一个字符串,你可以标记一个子序列,子序列中的字符不能相邻,剩下的删除掉,问最后能形成多少种不同的子序列。 #解题思路 可以设dp[i]表示以i结尾并且最后剩下的子序列有第i位时有多少不同的子序列。设dp[1] = dp[0] = 1, 那么我们的状态转移方程就是$dp[i]
阅读全文
摘要:题目链接 #题目大意 略 #解题思路 最终的结果可以用数字,减号与括号表示,如果把所有的括号去掉,就得到了一个由数字,加法与减法组成的式子,可以想到,对于每一个数字,都有加上它或者减去它两种情况,很明显可以用01背包来解决。需要注意的一点是,第一个数字前头没有符号,而第二个数字肯定是被减的。 那么怎
阅读全文
摘要:题目链接 #题目大意 给你一个字符串s,问长度为2n并且s为其子串的字符串有多少个。 #解题思路 一开始我想了几种状态方案,都有重复的情况,后来看了题解才知道还能这样做。我们设dp数组为dp[i][j][k],分别表示在长度为2n的字符串的第i位,括号序列的匹配度为j(遇到左括号+1,遇到右括号-1
阅读全文
摘要:题目链接 #题目大意 从n个人里面挑几个分成不大于k个组,要求每组中的任意两个数相差不超过5,组与组之间独立,问最多选出多少人。 #解题思路 比较经典的dp,排序之后二分出前面不小于当前数-5的数字有多少,然后写n*n的dp就行了。 #代码 const int maxn = 5e3+10; cons
阅读全文
摘要:题目链接 #题目大意 给一列数,你可以选择一段连续区间(可以为空)将其乘上x,求最大子段和。 #解题思路 子段和最大的区间一共有三种情况,要么全是没乘x的,要么全是乘上x的,要么是中间有一段是乘上x两端没乘(两端也可以没有),开个二维数组表示三种状态即可。 #代码 const int maxn =
阅读全文
摘要:题目链接 #题目大意 有个n*m的矩阵,从他的四条边看去都有数,问有多少种可能。 #解题思路 利用dp来求解,设dp[i][j]为i×j矩阵的答案。那么对于一个i行j列的矩阵,我们可以拿之前1×(j−1)的矩阵来做,然后将其和剩下的空行排列组合,为了保证空行的j-1列
阅读全文
摘要:题目链接 #题目大意 给两个不同的字符串,比较其相似度,你可以在字符之间插入'-',不同字符之间的相似度参考题目中的表格。 #解题思路 这题主要还是考验对LCS的理解。定义dp[i][j]表示第一个串s1长度为i时与第二个串s2长度为j时的相似度(注意不算'-')。 我们在求dp[i][j]的时候,
阅读全文
摘要:"题目链接" 题目大意 有N个学生合影,站成左对齐的k排,每行分别有N1,N2…NK个人,第一排站最后,第k排站之前。学生身高依次是1…N。在合影时候要求每一排从左到右递减,每一列从后面到前也递减,一共有多少总方案。 解题思路 考虑放最低的学生的情况,我们会发现,对于所有情况,最低的学生只能放在某一
阅读全文
摘要:题目链接 #题目大意 给一个长度为n的字符串,要求将它染色然后按字典序交换排序(可以理解为冒泡),只有颜色不同的字符之间才能互相交换,问最少能用多少种颜色并且输出染色方案。 #分析 ##只需要染一种颜色的情况 显然,像是abcdefghijklmn...这种根本不需要相互交换,所以只需要一种颜色
阅读全文
摘要:"题目链接OvO" 题目大意 给你n串数字,1代表该位置是亮的,0代表是灭的。你必须修改k个数字,使某些0变为1。注意,只能把原来的0改成1。 分析 由于每串数字上的1是不能修改的,所以每串数字并不一定能完整的表示09之内的所有数,所有需要先对每串数字做一下
阅读全文
摘要:题目链接 题目大意:给n个数,把他们划成m个连续子段,求这个m个连续子段的和的最大值。子段与子段之间不交叉,可以不连续。 这题如果直接做的话不太好做,我们先考虑一下m=1的情况。设dp数组为dp[i][j],i表示划成i段的最大子段和,j表示当前第j个元素,数
阅读全文
摘要:"题目链接" 题目大意:一只青蛙可以从0开始在[0,n)的区间内向右跳跃,每次跳跃之后可以获得落点的值(起点也算),每步的大小为[a,b],最多跳k步,问你最大值。 我们不妨先想象所有的情况, 第一步,青蛙可以从起点跳到e(e∈[a,b])。第二步,青蛙可以从之前落下的
阅读全文