算法学习day39-动态规划

打家劫舍

核心思路

  • dp[i][0]: 打劫i 能得到的最大金额

  • dp[i][1]: 不打劫i 能得到的最大金额

  • 推导

    • 打劫i, 能得到的最大金额, 一定是i-1[1] + nums[i]
    • 不打劫i, 能得到的最大金额, 那偷上一家和不偷上一家都可以, 所以要取i-1最大的那个数
    java 复制代码
      public int rob(int[] nums) {
          int[][] dp = new int[nums.length][2];
          //dp[i][0]: 偷i的金额 = [i - 1][1] + nums[i]
          //dp[i][1]: 不偷i的金额 = [i - 1][0]
          dp[0][0] = nums[0];
          dp[0][1] = 0;
          for (int i = 1; i < nums.length; i++) {
              dp[i][0] = dp[i - 1][1] + nums[i];
              dp[i][1] = Math.max(dp[i - 1][0],dp[i - 1][1]);
          }
          return Math.max(dp[nums.length - 1][0],dp[nums.length - 1][1]);
      }

思路2

  • 一维数组

    • 如果打劫i, 那么i的值就是dp[i-2]+nums[i]
    • 如果不打劫i, 那么i的值就等于dp[i-1]
    • 取最大值
    java 复制代码
      public int rob1(int[] nums) {
          if(nums.length == 1){
              return nums[0];
          }
          if(nums.length == 2){
              return Math.max(nums[0],nums[1]);
          }
          int[] dp = new int[nums.length];
          dp[0] = nums[0];
          dp[1] = Math.max(nums[0],nums[1]);
          for (int i = 2; i < nums.length; i++) {
              dp[i] = Math.max(dp[i - 2] + nums[i],dp[i - 1]);
          }
          return dp[nums.length - 1];
      }
相关推荐
周末也要写八哥4 分钟前
算法实例分析:使数组相等的最小开销
算法
吃好睡好便好8 分钟前
在Matlab中绘制质点运动轨迹图
开发语言·学习·算法·matlab·信息可视化
爱炼丹的James10 分钟前
第三章 搜索和图论
数据结构·算法·图论
菜菜笔记11 分钟前
【无标题】
算法
楼田莉子12 分钟前
C#学习之C#入门学习
开发语言·后端·学习·c#
hef28814 分钟前
用REGEXP函数简化城市销售数据统计的实践与学习路径
学习
努力努力再努力wz16 分钟前
【QT入门系列】QWidget 六大常用属性详解:windowOpacity、cursor、font、focus、toolTip 与 styleSheet
android·开发语言·数据结构·c++·qt·mysql·算法
Harm灬小海17 分钟前
【云计算学习之路】学习Centos7系统:Linux磁盘管理
linux·运维·服务器·学习·云计算
三品吉他手会点灯19 分钟前
C语言学习笔记 - 41.数据类型 - scanf函数核心知识点复习
c语言·开发语言·笔记·学习
Gauss松鼠会23 分钟前
GaussDB(DWS) 资源监控Topsql
java·网络·数据库·算法·oracle·性能优化·gaussdb