
动态规划
夏水天国
需要学的还有很多
展开
-
2020 China Collegiate Programming Contest, Weihai Site.L Clock Master (数论,背包问题)
原题链接题目大意:购买一个齿轮齿数为T的种需要T元,齿轮齿数为T的种可以表示T种时间状态。现给B元的预算,要求购买一些种,使得他们能表示的不同状态最多。一开始,这些种都指向0。一个3齿种与4齿种可以有12种状态。但两个3齿种与一个4齿种也只有12种状态。所以,想要组合数量更多,应该选择不同齿数的种。如果选择的种的齿数为a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1,a2,a3,...,an,那么组合数就是最小公倍数lcm(a1,a2,a3,...,an)lcm(原创 2022-02-18 17:22:49 · 161 阅读 · 0 评论 -
The 2021 ICPC Asia Nanjing Regional Contest H.Crystalfly(树上DP)
cjb的题解有一个容易被忘记的坑点:在我们锁定最大点w,然后对其他点进行第二种决策的计算时,要记得还要反过来拿其他店对w点进行一轮第二种决策的计算!!!还有别忘了if(i==fa)continue!!!另外vector里的pair的second是没有用的,可以忽略#include <bits/stdc++.h>#define int long long#define endl '\n'using namespace std;int n;const int N = 1e5 +.原创 2021-12-16 15:35:48 · 1158 阅读 · 0 评论 -
第 46 届 ICPC上海站I Steadily Growing Steam 蒸蒸日上(背包DP)
若⼲物品具有体积Ti和价值Vi,选出⾄多K件物品将其体积翻倍,然后选出若⼲物品并将其分为体积和相同的两堆,问选出的物品价值之和最⼤是多少。把分给alice的物品看作正值,把分给bob的物品看作负值。设一个DP[i][j][k]表示在前i个物品中选,最多用j次技能,alice与bob物品价值的差值。由于Ti<=13,所以K最大为2600,所以做一个偏移处理(防止出现负数)第一维也可以用滚动数组减少空间有个很奇妙的滚动数组的实现方法开F[2]用F[i&1]表示当前层,用F[i&原创 2021-12-04 15:40:34 · 723 阅读 · 0 评论 -
2021ICPC上海G Edge Groups(树上DP)
考虑一个菊花图:1号点为中心,其他n-1个点都与1号点直接相连。计算两个边分成一组,有多少分组方法:答案是1*3*5*7*…*n证明过程现在来考虑一个普通图:假设A点是B点的父亲B点有N个儿子(不包含父亲),假设全部都是叶子节点1:如果N是偶数,那么将这些连接叶子节点的边两两分组,它有1 * 3*5*7 … * N (1-N中的奇数相乘)种分组方法2:如果N是奇数,它同样有1 * 3 * 5 * … * N(1到N中的奇数相乘)种分组方法,而且必定会剩下一个边无法配对,所以这个剩下的边只好与原创 2021-12-02 10:36:42 · 827 阅读 · 0 评论 -
csp202104-4 校门外的树(60分)
满分的做法设f[i]为前i个障碍物所能生成的最多可能性设 cnt[i][j]为从第i个障碍物到第j个障碍物的可行方案数想要求cnt[i][j]只需从位置i枚举所有间隔的可能性,看是否能在不触碰到i,j之间的障碍物的情况下到达j很显然,如果知道了前3个障碍物生成的最多可能性并暴力处理cnt数组,那么当求f[4]时f[4]=f[1]*cnt[1][4]+f[2]*cnt[2][4]+f[3]*cnt[3][4];由于暴力处理cnt时间复杂度过大,所以只有60分#include <bits/原创 2021-09-15 22:58:59 · 360 阅读 · 0 评论