dp
2020100XWH
这个作者很懒,什么都没留下…
展开
-
数学递推式(参入数论)
问题:在1e9内所有素数中放回抽取,直至累乘积为目标值,求期望抽取次数递推公式(有回退性):记f[x]表示目标值为x时的期望次数f[x]=1+(( f[ x/prime[i] ]*p[i] )+f[x]*pp )得到x的期望等于这次没抽到x素因子的概率乘期望+抽到概率*剩余期望+1(这一次的递推)这里pp为定值,移项化简得到递推,递推特征是子状态的素因子一定在x中,记录所有素因子,然后每次枚举其素因子可重复的个数即可,这种没那么规整的递推多使用记忆化搜索,用个数组记录即可原创 2022-04-26 11:09:02 · 94 阅读 · 0 评论 -
依附背包呀
物品间有主次品的依附关系,这里就将依附关系的物品讨论成几种情况,能拿几种分别做成一个新的物品,这几个新物品相当于是互斥关系 最多选一个 最后就当分组背包处理这里由于只有一层依附关系,若有多层就从最底层出发分类处理。[NOIP2006 提高组] 金明的预算方案 - 洛谷#include<bits/stdc++.h>using namespace std;int dp[40000];vector <int> cc[40000];int main (){ ..原创 2022-04-23 20:24:12 · 124 阅读 · 0 评论 -
分组背包呀
所有物品分成k组,组内互斥对组01背包,最后一维枚举组中哪个#include<bits/stdc++.h>using namespace std;int dp[1005];struct one{ int m,w;};vector <one> v[1005];int main(){ int n,m; cin>>m>>n; int a,b,c; for(int i=1;i<=n;++i) .原创 2022-04-22 17:55:39 · 136 阅读 · 0 评论 -
二维01背包
直接二维倒序枚举#include<bits/stdc++.h>using namespace std;int dp[205][205];int main(){ int n,m,t; cin>>n>>m>>t; int mm[105],tt[105]; for(int i=1;i<=n;++i) { cin>>mm[i]>>tt[i]; } for原创 2022-04-22 17:16:28 · 125 阅读 · 0 评论 -
混合背包呀
1.滚动数组dp空间优化2.对不同背包讨论直接分类处理01: 倒序枚举完全:正序枚举多重背包:二进制分组3.!.注意输入别用自加 分开写!#include<bits/stdc++.h>using namespace std;int t1,m1,t2,m2;int dp[100006];int w[2000005],st[2000006],cc[2000006];int main(){ scanf("%d:%d %d:%d",&t1,&am.原创 2022-04-22 13:06:13 · 71 阅读 · 0 评论 -
抽象dpp
给定一个数列,求其中所有等差数列个数(包含1、2个元素)1.子状态:从左往右枚举,每次以新出现元素为结尾新增的等差数列个数2.状态:dp[i][j]表示以第i个数为结尾,公差为j的数列的个数(元素个数大于等于2)(找一个角度来划分目标)3.递推公式:dp[i][j]+=(dp[k][j]+1)(k=1.2.....i-1) (这里的+1是关键的地方,体现在若前面的数没有再前面的数则+1(做两个元素的等差数列)若有 则表示额外多了一个元素多的个数,而个数本身是由两个两个叠加起来的。这里计数注意只.原创 2022-04-22 09:43:07 · 73 阅读 · 0 评论 -
dp 优化
「SWTR-03」Golden Sword - 洛谷1.确定子状态:选完了前i个,当前剩下j个2.dp柿子:dp[i][j]表示如上含义3.递推公式:dp[i][j]=maxdp[i-1][j-1],j..j+s-1;4.去重(无)这里对区间最值做一个单调队列的优化(从后往前的滑动区间)先理清写出思路!好好写代码#include<iostream>#include<cstring>#include<vector>#inclu.原创 2022-04-21 12:19:36 · 107 阅读 · 0 评论 -
树形dp基础
1.给定中序遍历1,2,3....n,作用:越小的号码放在“越左子树”,对树的形状并没有什么限制。2.给定计算方式为左子树分数*右子树分数+根节点分数,所以对一个已知确定的树只需要摆定他的根就可以确定其得分 对此可以递归子树加枚举处理,而如何确定一个数(根可不定)由于中序遍历给定,所以对于任一个区间[i,j]可以达到需要,对于每个区间递归枚举根即可(这里采用记忆化搜索)#include<iostream>#include<cstring>#include<ve.原创 2022-04-21 00:04:19 · 950 阅读 · 0 评论 -
经典字符dp
给三种操作,删任意位置字符,添任意字符于任意位置,改任意字符为任意字符,求将串a变为串b的最小操作数dp四部曲:1.定义子状态:进行多次操作后将a变成b的所需操作数2.定义状态:dp[i][j]表示将串a的前i个字符转化为串b的前b个字符(提炼出的本质问题)3.递推公式:对于前两个操作即转化为dp[i-1][j] dp[i][j-1]取较小的再加一分别表示删去最后a最后一个和添b最后一个的子问题,对于第三个操作要讨论a[i-1]是否等于b[j-1]若等于再和dp[i-1][j-1]取..原创 2022-04-20 20:42:29 · 1021 阅读 · 0 评论