摘要:
状态表示:f(i, j, k, c) 表示走到(i, j)格子,已经取到k件宝物,并且最后一件宝物的价值为c的所有取法的集合,存储数量属性 状态计算:集合划分 \(f(i, j, k, c)=\) 集合中所有的数量加起来 通过集合分析得到状态转移方程: $ f(i, j, k, c) = f(i-1 阅读全文
摘要:
LIS:最长上升子序列问题,经典dp问题。 状态用一维来表示f(i) #include<iostream> using namespace std; const int N = 1010; int f[N]; int s[N]; int n, res; int main(){ cin >> n; f 阅读全文
摘要:
很久之前就看见过这个网站,今天突然想做一下试试hh 题面 方法 用的kmp。。。搞了好半天 #include<iostream> #include<cstring> using namespace std; const int N = 10010; char res[2][N]; int cnt, 阅读全文
摘要:
分组背包:有若干个商品的小组,每个小组里面有若干个商品,每一组只能选1或0个商品的背包问题。 #include<iostream> using namespace std; #define PII pair<int, int> #define v first #define w second con 阅读全文
摘要:
多重背包:每件物品不止一个,并且有个数限制的背包问题,注意和完全背包区分。 首先确定状态$f(i, j)表示从前i个物品中选择,并且总体积<= j的所有选法的集合,保存最大价值属性。$ 然后对$f(i, j)进行集合划分$ 此处出现了和多重背包之间的差别,完全背包可以对i号物品的选择情况无限划分下去 阅读全文
摘要:
f(i, j) 表示从(1, 1)走到(i, j) 的所有走法集合,存储集合中的路线中能够拿到的最大的花生数目。 f(i, j) 可以被不重不漏的分成两个部分: 从i - 1, j向南走一步到i, j的所有走法 从i, j - 1向东走一步到i, j的所有走法 所以有:\(f(i, j) = max 阅读全文
摘要:
技巧:蚂蚁相撞反向行驶,可以看成是两个蚂蚁穿过了对方,这个不影响答案 #include<iostream> using namespace std; const int N = 60; int a[N]; int n; int main(){ cin >> n; for(int i = 0; i < 阅读全文
摘要:
首先说明两个数如果不互质那么本题无解 裴蜀定理: \(gcd(a, b) = c, 如果c > 1那么一定存在x和y使得xa + yb = c\) 假设两个数不互质,假设存在最大的能表示的数m,那么有: \(xa + yb = m, 由于gcd(a, b) = c, 那么m = kc, 即xa + 阅读全文
摘要:
\(有一个长度为2n的01序列,其中1,0各n个,要求对于任意的整数k∈[1,2n],数列的前k个数中,\\ 1的个数不少于0的个数, 求对于任意一个n满足条件的串的个数。\) dp方法: $f(i, j)$表示存在i个0和j个1时满足条件的所有串的集合,存储数量属性 $1. i = 0: f(i, 阅读全文