力扣(LeetCode) 198.打家劫舍(java)

题目

方法一:动态规划

public class Rob {

    int max = 0;

    public int rob(int[] nums) {

        //动态规划,假设打劫n间,由于不能打劫相邻的两间,那么最后一间就有打与不打两种情况
        //情况1打,最高金额=最后一间的金额+打劫前n-2间的总金额
        //情况2不打,最高金额=打劫前n-1间的总金额
        //dp[n-1]代表第n间的打劫金额,由此可知,f(n) = max((dp[n-1]+f(n-2)),f(n-1))
        //特殊情况,只有1间时,f(1) = dp[0]。只有2间时,f(2) = max(dp[0], dp[1])

        int f1 = nums[0];
        if (nums.length==1) {
            return f1;
        }
        int f2 = Math.max(f1, nums[1]);
        if (nums.length==2) {
            return f2;
        }



        deal(nums, 2, f2, f1);

        return max;
    }

    public void deal(int[] nums, int k, int n1, int n2) {

        if (k == nums.length) {
            return;
        }

        int n = Math.max(nums[k]+n2, n1);
        max = Math.max(max, n);
        n2 = n1;
        n1 = n;
        deal(nums, k+1, n1, n2);
    }

    public static void main(String[] args) {
        Rob rob = new Rob();
        //int nums[] = new int[]{1,2,3,1};
        int nums[] = new int[]{2,7,9,3,1};
        System.out.println(rob.rob(nums));
    }

}

 LeetCode测试结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值