dp
喜欢刷dp的菜菜
这个作者很懒,什么都没留下…
展开
-
多重部分和问题
分组背包问题 注意边界和起始值为1就可 #include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <set> #include<cmath> using namespace std; const int N = 550; typedef long long ll; bool st[N]; int dp[N][N原创 2022-03-08 17:49:48 · 109 阅读 · 0 评论 -
dp推理(短小版)
dp从小到大看 能把状态表示出来的最小维度 一维——线性dp,dp一个空间就代表一个集合的属性值 题目问什么,集合就是什么 例如:以i结尾的上升子序列集合 属性就是:Max,sum,情况数 把集合分成小类, 1.结尾i是确定的 2.以i-1是哪个数来分类(倒数第二个数是序列第0个数,第一个数,第二个数,第三个数.....) 3.如果某个类存在 嘤嘤嘤,csdn嫌我过于短小哭唧唧 ...原创 2022-03-07 20:11:46 · 65 阅读 · 0 评论 -
最长上升子序列(线性dp)
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<cmath> #include<vector> #include<algorithm> #include<set> using namespace std; int ans; const int inf = 0x3f3f3f3f; const int .原创 2022-03-07 19:58:46 · 64 阅读 · 0 评论 -
多重集组合数dp
思路: 先用闫式dp分析法,确定属性和集合 dp[i][j] 集合就是表示看前i种物品取j个物品的集合 属性为%M的方案数 集合划分 就是从(i-1,j-0)~~(i-1,j-a[i]/i-1,j-j) 然后这是我们就发现这样加起来就是三层循环,第三层就是一部分上一层结果的和,按照移动窗口的思维,我们可以将前一步计算好的结果复用,从而降维。 有三个坑点 1.注意j-1-a[i]一定要大于零,特殊判断一下 2.%M要求算出的结果每次+M%M 3.dp第一个加的是(i,j-1),不要粗心写成原创 2022-03-07 19:45:51 · 149 阅读 · 0 评论