动态规划- Jump Game

本文介绍了使用动态规划解决Jump Game问题的方法。通过构造dp数组,dp[j][i]表示数组中第j个元素能否跳到j+i的位置。首先,遍历数组设置一步到达的情况,然后递增计算多步到达的可能性,即dp[i][j] = dp[j][k] && dp[j+k][i-k]。
public class JumpGame {

    public static boolean jg(int[] arr) {
        if (arr == null || arr.length == 0) {
            return false;
        }

        boolean dp[][] = new boolean[arr.length+1][arr.length+1];

        for (int j = 1; j <= arr.length; j++) {
            // distance
            int i = arr[j-1];
            while (i > 0) {
                dp[j][i--] = true;
            }
        }

        for (int i = 2; i <= arr.length; i++) {
            for (int j = 1; j+i <= arr.length; j++) {
                if (!dp[j][i]) {
                    for (int k = 1; k < i; k++) {
                        if (dp[j][k] && dp[j+k][i-k]) {
                            dp[j][i] = true;
                            break;
                        }
                    }
                }
            }
        }

        return dp[1][arr.length-1];
    }

    public static void main(String[] args) {
        System.out.println(jg(new int[]{2,3,1,1,4}));
        System.out.println(jg(new int[]{3,2,1,0,4}));
    }

}

解题思路:

构造dp数组,dp[j][i]表示第j个元素能否跳到j+i个元素

  1. 一步到达:遍历输入数组arr, 标记j位置后距离i=1~arr[j-1]个位置可达, 即 dp[j][i] = true

  1. 多步到达:将距离i拆分为2段,左边距离k,右边i-1, 距离i可达的问题转换为了i位置k距离可达,和 j+k位置i-k距离可达, 即 dp[i][j] = dp[j][k] && dp[j+k][i-k]。 由于是递增计算距离i是否可达,所以在计算 dp[i][j] 时, dp[j][k] 和 dp[j+k][i-k] 已经计算过。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值