zoukankan      html  css  js  c++  java
  • 198. 打家劫舍

    题干

    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

    给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

    示例 1:

    输入:[1,2,3,1]

    输出:4

    解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

    示例 2:

    输入:[2,7,9,3,1]

    输出:12

    解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。

         偷窃到的最高金额 = 2 + 9 + 1 = 12 。

     

    提示:

    0 <= nums.length <= 100

    0 <= nums[i] <= 400

    来源:力扣(LeetCode)

    链接:https://leetcode-cn.com/problems/house-robber

     

    思路

    找到状态转移方程

    遍历每间房

    如果偷窃第i间房,则说明第i-1间房不能偷窃,并记录下之前积累金额+第i间房的金额

    如果不偷窃第i间房,则第i-1间房可能被偷窃,可能不被偷窃。从中选取积累金额最大的

    class Solution {
        public int rob(int[] nums) {
           if(nums.length==0){
               return 0;
           }
           else{
                int[] dp0=new int[nums.length+1];
                int[] dp1=new int[nums.length+1];
                dp0[0]=0;
                dp1[0]=nums[0];
                for(int i=1;i<nums.length;i++){
                    dp1[i]=dp0[i-1]+nums[i];
                    dp0[i]=Math.max(dp0[i-1],dp1[i-1]);
                }
                return Math.max(dp1[nums.length-1],dp0[nums.length-1]);
           }
           
        }
    }
  • 相关阅读:
    CF1454F Array Partition
    leetcode1883 准时抵达会议现场的最小跳过休息次数
    leetcode1871 跳跃游戏 VII
    leetcode1872 石子游戏VIII
    CF1355C Count Triangles
    CF1245D Shichikuji and Power Grid
    CF1368C Even Picture
    CF1368D AND, OR and square sum
    CF1395C Boboniu and Bit Operations
    SpringBoot和开发热部署
  • 原文地址:https://www.cnblogs.com/ak918xp/p/14196838.html
Copyright © 2011-2022 走看看