[dp]leetcode 198. House Robber

输入:一个数组nums,每一个元素nums[i]表示第i个房间的价值。
输出:一个抢劫犯能抢到又不会被警察发现的最大价值。
规则:如果抢劫犯抢了相邻房间,那么报警装置就会触发,警察会得到通知。
分析:我可以从第0个房间开始,可能抢,也可能不抢,一直到最后一个房间,得到的价值取最大值就是结果。用回溯法吧。

public class HouseRobber198 {private int[] nums;private int max = 0;public int rob(int[] nums) {this.nums = nums;max = 0;rob(0,0,true);return max;}private void rob(int idx,int value,boolean robable){if(idx==nums.length){max = Math.max(max,value);}else{//System.out.println(idx+" "+robbed+" "+value);int idx2 = robable?1:0;if(robable){rob(idx+1,value+nums[idx],false);}rob(idx+1,value,true);}}
}

分析2:这样写完,画决策分析树,或者打印idx,robbed,value,就会发现有些是重复的。2 false 重复了两次。因为要计算的是最大价值,所以只需要保留一个最大值。所以我们可以使用缓存减少计算量。

0 false 0
1 true 1
2 false 1
3 true 4
3 false 1
1 false 0
2 true 2
3 false 2
2 false 0
3 true 3
3 false 0
	private int[] nums;private int max = 0;private int[][] memo;public int rob(int[] nums) {this.nums = nums;max = 0;memo = new int[nums.length][2];rob(0,0,true);return max;}private void rob(int idx,int value,boolean robable){if(idx==nums.length){max = Math.max(max,value);}else{//System.out.println(idx+" "+robbed+" "+value);int idx2 = robable?1:0;if(value<memo[idx][idx2]){return;}memo[idx][idx2]=value;if(robable){rob(idx+1,value+nums[idx],false);}rob(idx+1,value,true);}}

分析3:把以上代码改为迭代版本。把变量名memo改为dp。

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

看着写出来的dp代码我发现可以这样整理自己的逻辑。

给定一个数组nums={1,2,3,1}。
如果只有第0个房间,可能抢也可能不抢。但这基本是废话,不抢显然拿不到价值。
  抢,得1,
  不抢得0。
  取最大值,得到的价值是1。
如果只有第0个和第1个 房间。对于房间1可能抢,也可能不抢。
  如果抢第1个房间,那得到的价值是2,因为第0个房间不抢的价值是0。
  如果不抢第1个房间,那得到的价值是1,因为第0个房间抢,得1,不抢得0,取最大值。Max(抢第1个房间,不抢第1个房间)=2。

如果只有第0个、第1个 ,第2个房间。对于房间2可能抢,也可能不抢。
  如果不抢第2个房间,那最后拿到的价值就是Max(抢第1个房间,不抢第1个房间)=2。
  如果抢第2个房间,那最后拿到的价值就是不抢第1个房间的价值+nums[2]=1+3=4。
  那最大的答案是Max(不抢第2个房间,抢第2个房间)=4。
分析到这里我们知道在新增一个房间的时候与上一个房间的抢和不抢获得的价值有关系。最后答案是在当前房间号抢和不抢状态取最大值。这样基本上dp方程就出来了。

我们用dp[i]记录第i个房间的状态,dp[i][0]表示第i个房间不抢的价值,dp[i][1]代表第i个房间抢后的价值。
dp[i][0]=max(dp[i-1][0],dp[i-1][1])
dp[i][1]=dp[i-1][0]+nums[i]

嗯,这就是我的思考方式,是从回溯算法开始,不断优化,最后整理到dp,然后总结出dp应该这样思考。当然还缺少一步是内存优化。只与上一步的状态有关系,可以用变量表示,而无需数组。

	public int robV4(int[] nums) {if(nums==null || nums.length==0) return 0;int n = nums.length;int v0 = 0 ,v1=nums[0];for(int i=1;i<n;i++){int tmp0 = Math.max(v0,v1);int tmp1 = v0+nums[i];v0=tmp0;v1=tmp1;}return Math.max(v0,v1);}

213 House Robber II

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]45.描述一些对抗RSA侧信道攻击的防御方法

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 为了让这篇文章保持简单&#xff0c;我们将会我们将讨论所谓的“香草”RSA(在加密中不使用随机性)&#xff…

第六十六期:运维专家写给运维工程师的6条人生忠告

最近由于新公司需要招聘运维人员&#xff0c;所以接触了大量应聘者&#xff0c;基本都是85后的年轻人。在他们身上看到年轻的活力&#xff0c;也看到浮躁社会留下的烙印。作为一个奔5的老IT运维人员&#xff0c;真心希望他们少走自己的弯路&#xff0c;能够成就自己的一番事业&…

深度学习03——CNN

说明&#xff1a;本系列是七月算法深度学习课程的学习笔记 文章目录1神经网络与卷积神经网络1.1 深度神经网络适合计算机视觉处理吗1.2CNN的结构1.2.1 数据输入层1.2.2 卷积层1.2.3 激励层1.2.3 池化层1.2.4 全连接层1.3CNN的训练算法1.4CNN的优缺点2正则化与Droupout3典型结构…

第六十八期:做中台找死,不做中台等死?

今年参加了云栖大会&#xff0c;作为中台的践行者&#xff0c;我也更关注中台架构实施的行业状况&#xff0c;学习了其他公司中台的思想和经验。 作者&#xff1a;谭明智 今年参加了云栖大会&#xff0c;作为中台的践行者&#xff0c;我也更关注中台架构实施的行业状况&#…

自定义select样式

select {/*Chrome和Firefox里面的边框是不一样的&#xff0c;所以复写了一下*/border: solid 1px #000;/*很关键&#xff1a;将默认的select选择框样式清除*/appearance: none;-moz-appearance: none;-webkit-appearance: none;/*在选择框的最右侧中间显示小箭头图片*/backgrou…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]46.Sigma协议正确性、公正性和零知识性

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 在Sigma协议中&#xff0c;正确性&#xff0c;公正性和零知识性意味着什么? Sigma协议 一个更一般的理解 …

[dp]leetcode 746. Min Cost Climbing Stairs

输入&#xff1a;一个数组cost&#xff0c;cost[i]表示越过第i个台阶的代价&#xff08;可能是热量&#xff0c;也可能是过路费&#xff09; 输出&#xff1a;走过这n个台阶&#xff0c;需要的最小代价 规则&#xff1a;一旦你为第i个台阶付出代价cost[i]&#xff0c;那么你可以…

第六十七期:全球500强公司的2100万登录信息惊现于暗网上!

暗网上多处出现了从《财富》500强公司窃取的2100余万条登录信息&#xff0c;其中许多登录信息已被破解&#xff0c;以明文形式提供。 作者&#xff1a;布加迪编译 暗网上多处出现了从《财富》500强公司窃取的2100余万条登录信息&#xff0c;其中许多登录信息已被破解&#xff…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]47.什么是Fiat-Shamir变换?

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 只要Alice和Bob同时在线&#xff0c;Sigma协议能快速的完成Alice向Bob证明的任务。Alice向Bob发送承诺&…

第六十九期: 漫画说算法之什么是一致性哈希?

当缓存集群的节点有所增加的时候&#xff0c;整个环形空间的映射仍然会保持一致性哈希的顺时针规则&#xff0c;所以有一小部分key的归属会受到影响。 作者&#xff1a;IT知识课堂来源 一年之前—— 未来两年内&#xff0c;系统预估的总订单数量可达一亿条左右。 按Mysql单表…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]48.TPM的目的和使用方法

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 TPM&#xff08;Trusted Platform Module&#xff0c;可信平台模块&#xff09; 在检查TPM目的之前&#x…

[dp]leetcode 1025. Divisor Game

输入&#xff1a;一个正整数N 输出&#xff1a;Alice赢&#xff0c;返回true&#xff0c;否则false 规则&#xff1a;黑板上给出一个数字N&#xff0c;ALice先选择。Bob后选择。他们可以选择一个数字 X&#xff0c;0<X<N并且N%X0。一个人选择X以后&#xff0c;黑板上的数…

spring学习(25):通过构造函数依赖注入

目录结构 pox.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

计算机原理

计算机组成原理 简单易学、开源免费、可移植、可拓展、可嵌入、面向对象&#xff0c;比java、c#等更彻底 谷歌、CIA、nasa、YouTube、Dropbox、Instagram、Facebook、redhat、豆瓣、知乎、春雨医生、搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝、土豆、新浪、果壳等都在使…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]49.描述在IPsec和TLS后的基本想法

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 网络安全协议&#xff08;Internet Protocol Security&#xff0c;IPsec&#xff09;和安全传输层协议&…

spring学习(26):更优雅的依赖注入 在@bean注入参数

目录结构 pox.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

[dp] LeetCode 62. Unique Paths

输入&#xff1a;两个int m和n 输出&#xff1a;一个int,表示不同路径的个数。 规则&#xff1a;有一个m行n列的矩阵&#xff0c;一个机器人从左上角走到右下角&#xff0c;每次向下或者向右走一格。 分析&#xff1a;目的是要找到从(0,0)到(m-1,n-1)有多少种不同 的走法。如果…

springboot 控制台程序读取配置文件(原创)

首先新建一个springboot项目&#xff0c;此处省略。 1.新建一个application.properties person.namekevin person.age6 person.sexmale 2.新建一个类&#xff0c;自动读取对应字段的值 有两种方式&#xff0c; 第一种 package cn.wq;import org.springframework.beans.factory.…

spring学习(27):通过setter依赖注入

目录结构 pox.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]50.什么是BLS基于对的签名方案?

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 转载链接&#xff1a;https://www.cnblogs.com/zhuowangy2k/p/12248721.html