你站在一座山的山脚下,面前有 n 个台阶通向山顶。每个台阶上都放着一些金币。
规则:你每次可以走 1 阶或 2 阶,目标是收集最多的金币。
台阶金币:[3, 2, 7, 1, 5, 8, 4, 6]
🤔 朴素想法:枚举所有可能的走法(每一步选1或2),取最大值。
但走法有 2ⁿ 种!n=40 时就有万亿种走法,根本算不完!
💡 聪明想法:站在第 i 阶时,你只需要知道"到第 i 阶最多能拿多少金币"。
而从第 i-1 阶或第 i-2 阶跨上来,取最大值即可!
dp[i] = max(dp[i-1], dp[i-2]) + coins[i]
这就是动态规划(Dynamic Programming, DP)的核心思想:记住已经算过的结果,避免重复计算!
用这个公式,只需 O(n) 时间就能算出答案。n=40 时毫秒级完成!
💡 登山寻宝手推过程
coins = [3, 2, 7, 1, 5, 8, 4, 6](下标从1开始)
dp[1] = 3(只能走到第1阶)
dp[2] = max(dp[1], 0) + 2 = max(3, 0) + 2 = 5(从起点直接跨2阶,或走1+1)
dp[3] = max(dp[2], dp[1]) + 7 = max(5, 3) + 7 = 12
dp[4] = max(dp[3], dp[2]) + 1 = max(12, 5) + 1 = 13
dp[5] = max(dp[4], dp[3]) + 5 = max(13, 12) + 5 = 18
dp[6] = max(dp[5], dp[4]) + 8 = max(18, 13) + 8 = 26
dp[7] = max(dp[6], dp[5]) + 4 = max(26, 18) + 4 = 30
dp[8] = max(dp[7], dp[6]) + 6 = max(30, 26) + 6 = 36
答案:最多收集 36 枚金币!路径:1→2→3→4→5→6→7→8(每阶都踩,金币总和 3+2+7+1+5+8+4+6=36)