当前位置: 首页 > news >正文

LeetCode198.打家劫舍

 打家劫舍和背包问题一样是一道非常经典的动态规划问题,只要做过几道动态规划的题,这道题简直就非常容易做出来。我应该花了10来分钟左右就写出来了,动态规划问题最重要的就是建立状态转移方程,就是说如何从上一个状态转移到下一个状态的。直观的说就是dp[i]是怎么来的,是通过dp[i-1]来的还是通过dp[i-2]来的等等,如果知道初始状态和状态转移方程,那么每个状态都可以算出来,以下是我的代码:

class Solution {public int rob(int[] nums) {int n = nums.length;int[][] dp = new int[n][2];dp[0][0] = 0;dp[0][1] = nums[0];int max = Math.max(dp[0][0], dp[0][1]);for(int i=1;i<n;i++){dp[i][0] = max;dp[i][1] = dp[i-1][0]+nums[i];max = Math.max(dp[i][0], dp[i][1]);}return max;}
}

 数组大小是n,我建立一个int[n][2]的dp数组,其中dp[i][0]表示不偷第i家能获得的最大的价值,dp[i][1]表示偷第i家能获得的最大的价值。max表是dp[i][0]和dp[i][1]中的最大值,表示偷到第i家能获得的最大价值(因为是从第0家偷到第n-1家的)。

初始状态:dp[0][0]=0; 表示不偷第0家,dp[0][1]=nums[0];表示偷第0家。

状态转移方程:dp[i][0] = max;这个max是dp[i-1]的最大值,就是说如果我不偷第i家,那么第i-1家偷不偷都可以,所以不偷第i家的最大值就是第i-1家的最大值,与偷不偷i-1无关。

dp[i][1] = dp[i-1][0]+nums[i];偷第i家的最大值就是不偷第i-1家的最大值dp[i-1][0]+第i家的价值nums[i];

最后只要返回dp[n-1][0]和dp[n-1][1]中的最大值即可,而max正好是两者中的最大值,所以只要返回max即可。

动态规划问题都是这个套路,找到状态转移方程,通过初始状态算出每个状态,返回最后那个状态或者返回所有状态中的最值。

看看题解有没有新颖的解法。

题解的思路确实更清晰,他dp数组是一维的,没有分什么偷和不偷,dp[i]就表示在第i家的最大价值也就是max,那么状态转移方程就是:dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);dp[i-2]+nums[i]表示偷第i家,那么就是在第i-2家的最大值家上nums[i];dp[i-1]就是不偷第i家,那么就是第i-1家的最大值。dp[i]取两者中的最大值即可。

class Solution {public int rob(int[] nums) {if (nums == null || nums.length == 0) {return 0;}int length = nums.length;if (length == 1) {return nums[0];}int[] dp = new int[length];dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < length; i++) {dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);}return dp[length - 1];}
}

http://www.lryc.cn/news/248172.html

相关文章:

  • Appium PO模式UI自动化测试框架——设计与实践
  • 使用VUE3实现简单颜色盘,吸管组件,useEyeDropper和<input type=“color“ />的使用
  • matlab提取特征(医学图像)
  • P4 C++ 条件与分支(if)
  • django+drf+vue 简单系统搭建 (4) 用户权限
  • stm32 计数模式
  • rss服务搭建记录
  • GEE 23:基于GEE实现物种分布模型之随机森林法
  • HCIE 01:基于前缀列表的BGP ORF功能
  • 基于SSM的云鑫曦科技办公自动化管理系统设计与实现
  • Angular项目中如何管理常量?
  • 【机器学习 | 可视化】回归可视化方案
  • 树与二叉树堆:链式二叉树的实现
  • C++面试的一些总结day1:指针和引用的区别
  • Java核心知识点整理大全15-笔记
  • 初始本地仓库推送到远程仓库-git
  • OpenCV | 图像梯度sobel算子、scharr算子、lapkacian算子
  • WS2812灯条基于WLED开源项目无门槛使用简介
  • 基于AOP的声明式事物控制
  • 第七节HarmonyOS UIAbility生命周期以及启动模式
  • matlab设置背景颜色
  • Linux gzip命令用法详解:如何压缩和解压文件(附实例教程和注意事项)
  • 初刷leetcode题目(11)——数据结构与算法
  • 基于SSM框架的图书馆管理系统设计与实现
  • 【面试】css预处理器之sass(scss)
  • Android设计模式--享元模式
  • 人工智能对我们的生活影响有多大
  • 【蓝桥杯选拔赛真题26】C++字符串逆序 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析
  • antd vue a-select 下拉框位置偏移
  • Windows10免安装PostgreSQL