![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
蓝桥杯辅导课之数学与简单DP
文章平均质量分 70
凌窍
只有变强才能被尊重,才有选择的权利!
展开
-
*波动数列c++
从上面(2)式可以看出,对于确定的s,n,每个x都由一组(d1, d2, ..., dn)唯一确定,同时,如果确定了一个x,那么一组(d1, d2, ..., dn)也会唯一确定,即一个数列就确定了,因此(d1, d2, ..., dn)的合法组数等于满足题目要求的数列总数。发现左式的余数和 j - (n - i)a mod n的余数相同,根据集合定义,f[i - 1][([ j - (n - i)*a) mod n] 就是这些(d1,d2,…那什么样的一组(d1, d2, ..., dn)是合法解?原创 2024-03-16 00:26:35 · 593 阅读 · 0 评论 -
*地宫取宝c++
为所有从起点走到(i,j),且已经取了ki件物品,且最后一件物品的价值是C的合法方案的集合。集合属性为满足集合定义的方案数总和。原创 2024-03-13 14:14:39 · 590 阅读 · 0 评论 -
最长上升子序列c++
要计算以f[i]结尾的最长上升子序列,那么我们可以利用在a[i]这个数之前算过的最长上升子序列f[j],如果a[j] 小于 a[i],说明a[i] 是可以放到a[j]后面 成为一条长度为f[j] + 1的上升子序列的。如果a[i]能放到多条f[j]后面,那么以a[i]结尾的最长上升子序列为f[i] = max(f[i], f[j] + 1)。因为题目要求最长上升子序列,通过这样定义集合,我们可以枚举所有序列,并可以求出所有以f[i]结尾的最长上升子序列,那我们就可以f[i]中选出一个最大的作为答案了。原创 2024-03-08 14:50:10 · 316 阅读 · 0 评论 -
摘花生c++
对于本题,可以按第一步往哪个方向走来划分集合,分为两个小的集合:第一步向东走的,第一步向南走的。,第一步都是在(1, 1)这个坐标,那摘到的花生数可以设为f(1, 1) = m(1, 1) + f(1, 2)。,第一步都是在(1, 1)这个坐标,那摘到的花生数可以设为f(1, 1) = m(1, 1) + f(2, 1)。对于状态表示,又可以从集合定义和集合的属性两方面考虑。对于本题,我将集合f(i, j)定义为从某坐标(i, j)出发的所有路径,属性(即f(i, j)存的值)定义为摘到花生的最大数量。原创 2024-03-07 09:56:25 · 475 阅读 · 0 评论 -
买不到的数目c++
题目说“一定有解”,那么怎样的数据才有解?当gcd(n, m) 大于1,比如gcd(n, m) = 2,只要糖果的数量是2的倍数,那么这个数就能用n和m包装完,而糖果的数量不是2的倍数,就不能用n和m包装完,因此不存在最大不能买到的数量。而当gcd(n, m) 等于1时,必定有最大不能买到的数量。一开始不知道怎么做的时候,想要暴力枚举对于特定的包装n, m,最大不能买到的数量maxValue是多少,然后观察性质做优化。那么怎么确定枚举结果是否正确呢?原创 2024-03-04 21:19:30 · 376 阅读 · 0 评论