← 返回课程路线 第四阶段 · S4-06 · 60 分钟

选或不选,推出最优子结构

这一课只练一件事:遇到“不能选相邻两个位置、要最大化总和”这类问题时,用 dp[i] 表示到第 i 个位置为止能拿到的最大总和,用写出转移式子,并确认这是而不是靠感觉贪心。必会:能列出状态表、能写出转移式子、能检查不可达状态(比如 i-2 不存在时不能越界读取,要按已给的初值处理)。最小示例:4 个位置的金额 3 7 4 6,规则是不能选相邻两个位置,求能拿到的最大总和,1 <= n <= 1000。样例追踪:dp[0] = 3,dp[1] = max(3, 7) = 7,dp[2] = max(dp[1], dp[0]+4) = max(7, 7) = 7,dp[3] = max(dp[2], dp[1]+6) = max(7, 13) = 13,所以 dp[3] = 13。边界是 n=1(只有一个位置,直接选它)和不可达状态(i-2 越界时不能凭空访问,要靠 dp[0]、dp[1] 的初值兜底)。建议掌握:这比枚举所有选法(2 的 n 次方种)快得多,n 变大时只有枚举才会超时。拓展:如果 dp[i] 只依赖前两个状态,可以用把整个数组换成两个变量,现在只需要认识这个概念,不强制要求会写。这里不会在浏览器里运行 C++。

必会:能列状态表;能写转移式子;能检查不可达状态(i-2 越界时靠初值兜底) 建议掌握:DP 比枚举所有选法快得多,n 变大时枚举会超时 拓展:状态压缩——只用两个变量代替整个 dp 数组,现在先认识概念,不当硬门槛

任务 1:先选出该怎么定义状态

先用一句话确定 dp[i] 的含义,再确定第 i 个位置该怎么。点不认识的词可看基础解释。

必会:能说出 dp[i] 表示前 i 个位置(不选相邻)能拿到的最大金额;能说出第 i 个位置只有“选它”和“跳过它”两种情况,取较大值。这里不会在浏览器里运行 C++,只练习选择和走过程。

4 个位置的金额 3 7 4 6,不能选相邻两个位置,要求最大总和,该怎么定义状态最合适?状态定义 · 必会

确定用 dp[i] 表示前 i 个位置的最优解后,第 i 个位置该怎么决策?选或不选 · 必会