『DP』做题记录1
这个是蒟蒻的dp练习记录
ARC116D
题意:\(n\) 个数和为 \(m\) 且异或和为 \(0\) 的方案数。
这东西看上去不好 \(dp\) ,我们考虑二进制拆分。
设 \(f_i\) 表示和为 \(i\) 的方案数。
枚举最后一位增加的位数。
\(f_i=\sum_{j=2 \& \&j|2}^{n} f_{\frac{i-j}{2} \times C_n^j}\)
复杂度 \(O(n m)\) 。
ARC107D
题意:\(n\) 个数 可为 \(2^{-i}\) ,和为 \(m\) 的方案数。
不假思索得上 \(dp\) 。
设 \(f_{i,j}\) 为 \(i\) 个元素,和为 \(j\) 的方案数。
当有 \(1\) 时, \(f_{i,j}=f_{i-1,j-1}\)
否则 我们全体乘上 \(2\) 的时候方案数等价,即 \(f_{i,j}=f_{i,j \times 2}\)
\(\therefore f_{i,j}=f_{i-1,j-1}+f_{i,j \times 2}\)
复杂度 \(O(n m)\) 。
CF1342F
题意:每次操作删一个数,把权加到另一个数上,求使得序列严格单增的最少操作次数,输出操作步骤。
发现 \(n\) 很小,直接状压。
设计状态: \(f_{i,j,s}\) 表示已经决策 \(i\) 个集合,第 \(i\) 个集合选的最后留下的数为 \(j\) ,已选择 \(s\) 方案。
则有: \(f_{i,j,s} \rightarrow f_{i+1,v,k} \ \ (v >j \& \& s \subset k , v \in k-s)\)
转移需要技巧性,由已得的上个状态转移到可能的下个状态。
这样转移复杂度 \(O(n^2 3^n)\) 。
CF1225G
题意:给定数列 \(a\) ,有一个函数 \(f(x)=\begin{cases}f(\dfrac{x}{k})&x|k\\x& otherslse\end{cases}\) ,每次删去 \(x,y\) 加入 \(f(x+y)\) ,求最后是否能将 \(a\) 数列变为一个 \(1\) ,如果可以输出方案。
挖掘性质:首先发现如果能构造 \(\sum_{i=1}^{n} a_i k^{-b_i} = 1\) ,那就一定能构造出一种方案使得最终结果为 \(1\) 。
(upd:性质具体证明已经忘记了,后面的 dp 应该是简单的。)