摘要:
通过这道题对树形背包理解更深一步...... 有几个地方需要注意: 1.本题数据结构为森林,需增加一个超根作为根节点,M+=1(后面解释)。 2.本题有拓扑序的限制,通过vector建成的一棵树中,必须父节点选择了之后才可以往下选择孩子节点。 3.在以v为根的子树中选择k个节点,k必然小等于v的子树 阅读全文
posted @ 2022-06-18 16:38
YHXo
阅读(38)
评论(0)
推荐(0)
摘要:
一道好题...... 首先要将环形转化为线形结构,接着就是标准的区间DP,但这样的话复杂度为O(n3),n<=1000,要超时,所以要考虑优化。 dp[i][j]=min( dp[i][k]+dp[k+1][j]+sum(i,j) ),我们通过证明sum(i,j)满足四边不等式和区间包含单调性,从而 阅读全文
posted @ 2022-06-18 15:50
YHXo
阅读(39)
评论(0)
推荐(0)
摘要:
fn[i]表示走上第i级台阶的所有走法。 方程:fn[i]=fn[i-1]+fn[i-2]; 1 #include<cstdio> 2 #define MAXN 40 3 using namespace std; 4 typedef unsigned long long LL; 5 LL fn[MA 阅读全文
posted @ 2022-06-18 15:04
YHXo
阅读(52)
评论(0)
推荐(0)
摘要:
每种课程学习不同天数可以获得不同价值,这可以看成一个组,那么题目就是分组背包的模板题了。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define maxn 105 5 using namespace std; 6 阅读全文
posted @ 2022-06-18 14:56
YHXo
阅读(29)
评论(0)
推荐(0)
摘要:
多重背包就是每种物品有数量限制时求解最大价值。 如果一种物品数量和重量之积超过背包容量,可视为完全背包;其余情况通过二进制拆分,将几个数量的物品看成一个,转化为01背包求解。 按照这种思路代码是这样的: 1 #include<cstdio>//多重背包,二进制拆分 2 #include<cstrin 阅读全文
posted @ 2022-06-18 14:43
YHXo
阅读(48)
评论(0)
推荐(0)
摘要:
完全背包模板,和01背包相比不用倒推,因为一种可以选多个。 这道题求最小,dp数组初始化为无穷即可。 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int M 阅读全文
posted @ 2022-06-18 14:14
YHXo
阅读(74)
评论(0)
推荐(0)
摘要:
01背包模板题。 1维数组倒推。 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define M 1005 6 int dp[M]; 7 int val[M],v[M] 阅读全文
posted @ 2022-06-18 11:59
YHXo
阅读(26)
评论(0)
推荐(0)
摘要:
从每个节点u出发后有两种情况:回到u和不回到u。 dp数组设为三维,第一维是节点编号,第二维是从该节点开始走的步数,第三维1/0 表示是否回到该节点。 可以回到时:dp[u][j][1]=max(dp[u][j][1],dp[u][j-t][1]+dp[v][t-2][1]); 不能回到时,分为两种 阅读全文
posted @ 2022-06-18 11:51
YHXo
阅读(48)
评论(0)
推荐(0)
摘要:
对于每个u要设置三维。 dp[u][0]表示u是服务器,以u为根的最小服务器数,其子节点既可以是,也可以不是,dp[u][0]+=min(d[v][0],d[v][1]); dp[u][1]表示u不是服务器,但他的父节点时,此时u的子节点都不可能是,dp[u][1]+=dp[v][2]; dp[u] 阅读全文
posted @ 2022-06-18 10:52
YHXo
阅读(48)
评论(0)
推荐(0)
摘要:
节点u不放置,其所有子节点都需要放置:节点u放置,子节点既可以放置,又可以不放置,取min。 边界条件:dp[u][0]=0,dp[u][1]=1; 求解目标:min(dp[root][0],dp[root][1]),root是树根。 #include<cstdio> #include<cstrin 阅读全文
posted @ 2022-06-18 10:12
YHXo
阅读(35)
评论(0)
推荐(0)
摘要:
dp[u][0]表示不选u时在以u为根的子树中最大人数,dp[u][1]则是选了u后的最大人数; f[u][0]表示不选u时的唯一性,f[u][1]是选了u后的唯一性,值为1代表唯一,0代表不唯一。 当不选u时,u的子节点v可选可不选,dp[u][0]+=max(dp[v][0],dp[v][1]) 阅读全文
posted @ 2022-06-18 09:44
YHXo
阅读(34)
评论(0)
推荐(0)
摘要:
这道题的妙处在于把原问题看成矩阵连乘问题,求这些矩阵相乘的最小乘法次数,比如一个i*k矩阵乘一个k*j的矩阵,他们的乘法次数就是i*k*j (联想矩阵乘法的三层循环),题目说的取走一张牌,类似于矩阵相乘除去k,所以根据这个条件分析可以联想到矩阵。 题目要求首尾两端不可取,也就是求到最后只剩下一个矩阵 阅读全文
posted @ 2022-06-18 08:52
YHXo
阅读(50)
评论(0)
推荐(0)
摘要:
dp[i]表示要让i向上级发请愿书,最少需要多少个工人递交请愿书,因为要取前T%最小的,所以还要将i的子节点排序(这里用vector实现),取前c个最小的作为dp[i]的值。 这里用dfs可以省去dp数组,用返回值的方式实现。 1 #include<cstdio> 2 #include<cstrin 阅读全文
posted @ 2022-06-18 08:30
YHXo
阅读(41)
评论(0)
推荐(0)

浙公网安备 33010602011771号