思路讲解
AC代码
https://leetcode.cn/problems/kth-smallest-path-xor-sum/submissions/642233568/
1 |
|
https://leetcode.cn/problems/kth-smallest-path-xor-sum/submissions/642233568/
1 | #include <ext/pb_ds/assoc_container.hpp> |
1 | class Solution { |
类似于Floyd的递推公式
Untitled
1 | FOR(j,0,sum){ |
根本原因:保证状态转移的顺序正确性,避免“后效性”。
动态规划的一个基本原则是,当你计算一个状态 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的和) 作为外层循环,并从小到大枚举,就完美地解决了这个问题。
当外层循环执行到 c = 1 时,它会用所有 dp[...][0] 的值来更新 dp[...][1]。
当外层循环执行到 c = 2 时,它会用所有 dp[...][0] 和 dp[...][1] 的值来更新 dp[...][2]。
…
当我们计算 dp[...][c] 这一“层”的所有状态时,所有 c 值更小的“层”(比如 dp[...][c-1], dp[...][c-2] 等)都已经计算完毕并且得到了最优解。
这确保了我们每次进行状态转移时,dp[u[i]][c - a[i]] 已经是我们能找到的、到达节点 u 且 a 和为 c - a[i] 的最优值(即最小 b 和)。
327896817
1 | // Problem: A. Minimum Product |
【【直播回放】VP 四川省赛 2025年06月13日19点场】 【精准空降到 30:57】 https://www.bilibili.com/video/BV1iXM6zmEXT/?share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37&t=1857
看哥哥的视频。
主要就是树上dp,维护前缀和后缀。
https://codeforces.com/group/vXvHT09g9Y/contest/105949/submission/327796835
1 | // Problem: J. Sichuan Provincial Contest |
那么容易想到,原来出现过的 $a???a??\rightarrow aaaaa??
$ 并不会增加。
a?a?????c??c?→aaa?????cccc?。
1 | for(int i=0;i<M;++i){ |
那么继续,我们把拆贡献的思路拓展到极致,就是说其实无论怎么样搞,搞完前面这套操作,还要继续操作的话,必定会增加1个代价,那么我们只要构造增加一个代价的字符串就行了。
用代码描述就是这样。
1 | FOR(i,1,N){ |
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=78079278
1 | // Problem: In Falsus |