
DP
sunnyorrainy
这个作者很懒,什么都没留下…
展开
-
dp, LCS的变种
题意:题目链接给两个字符串s1, s2,分别取出它们的一个子串,st1, st2 对这两个子串求一个值, 问最大的值是多少。题解:LCS中,dp[i][j]表示以i, j结尾的最长公共子序列。现在的最大问题就是子串怎么求这个值,不可能把所有的子串都找出来。需要把LCS转变一下,让dp[i][j]的值等于以i,j结尾的字符串的,这个值的最大值。状态转移方程就变成了:if(s1[i]==s2[j])dp[i][j] = max(dp[i][j], dp[i-1][j-1] + 2), e原创 2020-11-17 19:49:43 · 206 阅读 · 0 评论 -
插入最少的字符,构造回文串
题目:题目链接给一个字符串,在任意的位置插入一些字符,使得这个字符串成为回文串,最少需要插入多少个字符。ps:有一个和这个题很像的题,都是插入最少的字符构造回文串, 但那个题是在字符串的尾部或者头部插入,而不是任意的位置。那个题可以用kmp做,也可以用马拉车做。以前写过在任意的位置插入,就是把这个字符串反转,求反转的和原来的字符串 最长公共子序列。然后答案就是长度减去LCSdp求LCS#pragma warning(disable:4996)#include<iostrea原创 2020-11-12 21:34:37 · 1463 阅读 · 0 评论 -
概率dp入门 求期望
题意:有n类bug, s种系统,每个bug可以属于一种系统,一类bug。每天可以找到一个新的bug,这个bug属于每一类bug的概率相同都是,属于每一种系统的概率也是相同的,都是。那么要使得每一类bug都至少有一个bug,每一个系统也至少有一个bug,所需要的天数的期望是多少。思路:考虑如果没有s种系统,只需要找到n类不同的bug,那么就非常的简单,这个期望就是n对于概率dp都是倒着推导的,dp[i][j]代表已经找到了i类bug,j种系统,需要的期望。很明显dp[n][s] .原创 2020-11-11 21:00:50 · 358 阅读 · 0 评论 -
区间dp 石子合并&矩阵链乘法
石子合并有n堆石子围成一个圈,每一堆石子可以和相邻的一堆合并得到新的一堆,所得的分数是新的一堆的数量。所有的石子合并成一堆后,最大的分数,最小的分数是多少。思路:这是一个环,需要拆分成链,把这n堆,复制一遍,变成2n堆。dp的时候还是得保证长度为n。dp_min[i][j]表示合并i~j这个区间所得到的最小的分数。状态转移:dp_min[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + a[j] - a[i-1])a数组是前缀和.原创 2020-11-10 17:40:04 · 229 阅读 · 0 评论 -
高精度&dp
题意:给定的n×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数每次取数时须从每行各取走一个元素,共nn个。经过mm次后取完矩阵内所有元素; 每次取走的各个元素只能是该元素所在行的行首或行尾; 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值\times 2^i×2i,其中ii表示第ii次取数(从11开始编号); 游戏结束总得分为mm次取数得分之和。1≤n,m≤80。题目链接思路:需要高精度算法,贴了个模...原创 2020-11-08 10:12:27 · 314 阅读 · 0 评论 -
取三个数,方差最小。
题意:题目链接有三个数组,a,b,c。从三个数组中,分别取出一个数,得到的三个数x, y, z,使得(x-y)^2+(x-z)^2 + (y-z)^2最小。输入:样例个数T,三个数组的大小,na,nb,nc。之后三行是桑数组的元素。思路:对三个数组进行排序,然后进行依次的遍历。但是不是暴力的遍历,暴力肯定会超时。因为每次必须从三个数组中分别取出一个,所以,设a,b,c三个数组的当前元素的下标为i, j, k,枚举三种情况,i+1, j+1, k+1.算出最小值,然后更新最终答案。..原创 2020-07-09 14:29:50 · 1015 阅读 · 0 评论 -
DP:一,数塔问题
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?已经告诉你了,这是个DP的题目,你能AC吗?Input输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数...原创 2019-04-25 21:26:17 · 969 阅读 · 0 评论 -
DP: 二,直线,折线分割平面
一,直线。0条的时候1,1条1+1,2条1+1+2,3条1+1+2+3,4条1+1+2+3+4。状态转移方程:dp[i]=dp[i-1]+i;dp[0]=1;公式:n条直线分割平面:((n+1)*n)/2+1;二,折线https://blog.youkuaiyun.com/magicnumber/article/details/43201063v字形的线。dp[i]=dp[i-1]+(i-...原创 2019-04-26 15:05:02 · 176 阅读 · 0 评论 -
DP,三,LIS和LCS
一,O(n^2)LCS:HDU1159最长公共子序列模板,求两个字符串的最长公共子序列#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;char a[10005],b[10005];int dp[1005...原创 2019-04-26 21:08:42 · 230 阅读 · 0 评论