0%

思路讲解

【树上背包【力扣周赛 451】】 https://www.bilibili.com/video/BV1o1jgzJE51/?share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37

这个视频讲树上背包问题讲的非常透彻,非常好。

这个第一个遍历边就不多说了,第二个循环倒过来是因为滚动数组优化,第三个必须正过来,你可以倒过来试一试,当数据中含有这个需要0元,但是价值不为0的物品时就会出错,这是因为倒过来遍历可能取了这个物品两次,正过来遍历的时候是空的,那么就不存在这个问题了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
      
auto dfs=[&](this auto &&self,int u,int p)->void{

for(auto v:g[u]){
if(v==p) continue;
self(v,u);
}
// memo是暂时不考虑当前节点u而定的
vector<array<int,3> > memo(budget+5,{0,0,0});

for(auto &v:g[u]){
for(int i=budget;i>=0;--i){
for(int j=0;j<=i;++j){ // 必须要正过来循环
memo[i][1]=max(memo[i][1],memo[i-j][1]+dp[1][v][j]);
memo[i][2]=max(memo[i][2],memo[i-j][2]+dp[2][v][j]);
}
}
}
for(int i=budget;i>=0;--i){
for(int j=1;j<=2;++j){
int cost=present[u-1]/j;
dp[j][u][i]=max(dp[j][u][i],memo[i][1]);
if(i>=cost){
dp[j][u][i]=max(dp[j][u][i],future[u-1]-cost+memo[i-cost][2]);
}
}
}
};

AC代码

心路历程(WA,TLE,MLE……)

思路讲解

AC代码

https://leetcode.cn/problems/kth-smallest-path-xor-sum/submissions/642233568/

心路历程(WA,TLE,MLE……)

思路讲解

AC代码

心路历程(WA,TLE,MLE……)

思路讲解

类似于Floyd的递推公式

Untitled

1
2
3
4
5
6
7
FOR(j,0,sum){
FOR(i,0,SZ(edges)-1){
ll u,v,a,b;u=edges[i][0],v=edges[i][1],a=edges[i][2],b=edges[i][3];
if(dp[u][j]>=INF) continue;
dp[v][j+a]=min(dp[v][j+a],dp[u][j]+b);
}
}

根本原因:保证状态转移的顺序正确性,避免“后效性”。

动态规划的一个基本原则是,当你计算一个状态 dp[S] 时,所有它所依赖的状态 dp[S'] 都必须是已经计算出来的、并且是最终的(最优的)值。

让我们来分析一下这个特定的状态转移 dp[v[i]][c] = ... dp[u[i]][c - a[i]] ...

  • 为了计算 c 这个总和的状态,我们依赖于 c - a[i] 这个总和的状态。

  • 因为边权 a[i] 是正整数 (a[i] >= 1),所以 c - a[i] 永远小于 c

c (a的和) 作为外层循环,并从小到大枚举,就完美地解决了这个问题。

  1. 当外层循环执行到 c = 1 时,它会用所有 dp[...][0] 的值来更新 dp[...][1]

  2. 当外层循环执行到 c = 2 时,它会用所有 dp[...][0]dp[...][1] 的值来更新 dp[...][2]

  3. 当我们计算 dp[...][c] 这一“层”的所有状态时,所有 c 值更小的“层”(比如 dp[...][c-1], dp[...][c-2] 等)都已经计算完毕并且得到了最优解。

这确保了我们每次进行状态转移时,dp[u[i]][c - a[i]] 已经是我们能找到的、到达节点 ua 和为 c - a[i] 的最优值(即最小 b 和)。

AC代码

327896817

心路历程(WA,TLE,MLE……)

思路讲解

【【直播回放】VP 四川省赛 2025年06月13日19点场】 【精准空降到 30:57】 https://www.bilibili.com/video/BV1iXM6zmEXT/?share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37&t=1857

看哥哥的视频。

主要就是树上dp,维护前缀和后缀。

AC代码

https://codeforces.com/group/vXvHT09g9Y/contest/105949/submission/327796835

心路历程(WA,TLE,MLE……)