本期讲解入门 \(dp\)。
知识点
\(dp\) 问题的特征:
-
可以通过对于子问题(与原问题结构相同但规模更小的问题)的求解来得出原问题的解。
-
无后效性(即对于当前问题的求解不会影响到其他问题的求解)。
\(dp\) 问题的求解过程:
我们令 \(dp\) 数组表示原问题的若干个子问题。
-
设计状态(即对于 \(dp_i\) 赋予实际意义,是问题的通解)。
-
确定答案,如果在状态设计好后仍无法确定答案,则说明状态设计错误。
-
找出状态转移方程(即规则,用于描述各个状态之间的关系)。
-
设计初始状态(即无法通过状态转移方程推出的状态)。
-
确定边界条件(即对于求解问题无关的状态)。
-
按照状态转移方程递推即可。
T1
考虑如何设计状态:\(dp_i\) 为以 \(i\) 结尾的最大子段和。
考虑答案是什么:显然每一个 \(i\) 都有可能为最大子段和的子段末尾,因此答案为 \(\max\{dp_i\}\)。
考虑如何转移:显然,对于每个 \(a_i\),我们都可以将其自行成为一个新的子段,或者让其接在上一个子段的末尾,于是转移方程为:
考虑如何设置初始状态:显然第一个数仅可能自己作为一个子段,因此初始状态为 \(dp_1=a_1\)。
因为本题只有一维,所以无需考虑边界条件。
于是根据方程递推求解即可。
T2
考虑如何设计状态:\(dp_{i,0}\) 为 \(i\) 位数含偶数个 \(3\) 的数字个数,\(dp_{i,1}\) 为 \(i\) 位数含奇数个 \(3\) 的数字个数。
考虑答案是什么:显然为 \(dp_{n,0}\)。
考虑如何转移:对于 \(dp_{i,0}\),我们可以不选 \(3\),此时有 \(9\) 种选择;也该可以选 \(3\),此时只有一种 \(1\) 中选择,因此 \(dp_{i,0} = dp_{i-1,0} \times 9 + dp_{i-1,1}\)。
考虑初始条件:显然 \(dp_{1,0} = 9,dp_{1,1} = 1\)。
本题亦无需考虑边界条件。
然后按照转移方程递推即可。