From 7814df74496017c2e1eacd1904349d1e1c66c90b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=99=E9=BB=98?= Date: Thu, 5 Oct 2023 11:08:27 +0800 Subject: [PATCH] =?UTF-8?q?Update=2055=20=E8=B7=B3=E8=B7=83=E6=B8=B8?= =?UTF-8?q?=E6=88=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...63\350\267\203\346\270\270\346\210\217.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/docs/Algorithm/55 \350\267\263\350\267\203\346\270\270\346\210\217.md" "b/docs/Algorithm/55 \350\267\263\350\267\203\346\270\270\346\210\217.md" index 3acdd123a77..169182b3551 100644 --- "a/docs/Algorithm/55 \350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/docs/Algorithm/55 \350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -51,3 +51,34 @@ public class Solution { // false ``` + + +## 动态规划 + +这是个非常明显的“多阶段决策最优解”类型的问题,每达到一个数组的元素,都是一个决策,这个决策的最优解就是我们当前阶段我们能够跳跃的最大值是多少 + +很明显,按照我们求解动态规划问题的步骤和思想,首先设定一个dp数组,`dp[i]`表示在下标i处能够跳跃的最大值 + +- 对于dp[i],它等于`dp[i-1]`跳一格到达i处后剩余的步数和`nums[i]`的两者中的最大值。因此状态转移方程为:`dp[i]=max(dp[i-1]-1,nums[i])` + +初始化条件就是`dp[0]=nums[0]`。 + +在每次循环开始,我们判断`dp[i-1]`是否等于0,若是,则不可能到达下标i处,因此直接返回false。循环结束后返回true + +```java +public class Solution { + public boolean canJump(int[] nums) { + // dp[i] 表示当前位置的最大步数 + int[] dp = new int[nums.length]; + dp[0] = nums[0]; + for (int i = 1; i < nums.length; i++) { + if(dp[i - 1] == 0){ + return false; + } + dp[i] = Math.max(dp[i-1]-1,nums[i]); + } + return true; + } +} +``` +