leetcode198
public class Solution {
public int Rob(int[] nums) {
int i = ;
int e = ;
for (int k = ; k < nums.Length; k++)
{
int tmp = i;
i = nums[k] + e;
e = Math.Max(tmp, e);
}
return Math.Max(i, e);
}
}
https://leetcode.com/problems/house-robber/#/description
/*
你是一个专业强盗,并计划沿街去盗窃每一个住户。
每个房子都有一定量的现金,阻止你盗窃的唯一阻碍是相邻的两个房子之间有安全系统。
一旦这两个房子同时被盗窃,系统就会自动联系警察。
给定一系列非负整数代表每个房子的金钱,
求出在不惊动警察的情况下能盗窃到的最大值*/
上面的程序不是很容易理解,略微进行修改如下:
public class Solution
{
public int Rob(int[] nums)
{
if (nums.Length > )
{
int i = nums[];
int e = ;
for (int k = ; k < nums.Length; k++)
{
var tmp = nums[k] + e;//抢当前的房间的累积金额,临时存储
e = Math.Max(i, e);
//i:不抢当前房间但是抢前一个房间
//e:不抢当前房间同时不抢前一个房间
//两者大的是新的e:不抢当前房间累积金额
i = tmp;//抢当前房间的累积金额
}
return Math.Max(i, e);
}
else
{
return ;
}
}
}
经过一段时间学习,重新做这道题,使用了更加容易理解的写法:
public class Solution
{
public int Rob(int[] nums)
{
var len = nums.Length;
if (len == )
{
return ;
}
else if (len == )
{
return nums[];
}
else if (len == )
{
return Math.Max(nums[], nums[]);
}
//len>=3
//var robmoney = 0;//累计的抢夺的钱
var money = new int[len];//记录截止到当前位置最多的金额
money[] = nums[];
money[] = Math.Max(nums[], nums[]);
for (int i = ; i < len; i++)
{
//如果当前房间-1已经被抢了,那么当前房间不能抢 新的累计金额是之前最大金额 //如果当前房间-1没有被抢,则新的累计金额是 之前最大金额+当前房间金额
money[i] = Math.Max(money[i - ], money[i - ] + nums[i]);
//robmoney += money[i];
} return money[len-];
}
}
用money数组记录,到当前i位置为止,所抢夺的最大的金额。
决定当前的i位置是否要抢里面的钱,根据i-1房间是否已经抢过来判断。
如果i-1房间被抢,那i位置房间的金额就不可以再抢。如果i-1房间没有被抢,则i位置最大金额就是i-2的最大金额+i房间的金额。
每次记录的是,截止到目前位置,最大的金额数。也就是这两种方案中较大的一种。
补充一个python的版本:
class Solution:
def rob(self, nums: List[int]) -> int:
n = len(nums)
if n == :
return
elif n == :
return nums[]
elif n == :
return max(nums[],nums[]) dp = [] * (n + )
dp[] =
dp[] = nums[]
for i in range(,n+):
dp[i] = max(dp[i-]+nums[i-],dp[i-])
return dp[n]
定义dp,长度n + 1,表示“到当前房间为止,所获得的最多钱数”。
dp[0]初始化为0,方便计算。
最后返回dp[n]为所求。
关键的公式是第15行,表示:当前房间能获得的最多钱数,是两种策略选择其一:
策略1:抢夺当前房间的钱,则抢夺后获得的金钱数量为,跳过前1个房间,也就是“上上个”房间所获得的最多金钱 + 当前房间的金钱
策略2:不抢夺当前房间的钱,则抢夺后(实际上没有抢)的金钱和“上个”房间所获得的最多金钱值一样。
比较这两种策略,选择多的作为dp[i]的结果,即表示截止到当前房间,所获得的最多的金钱数量。
leetcode198的更多相关文章
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- LeetCode198 House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- [Swift]LeetCode198. 打家劫舍 | House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- 【leetcode198 解题思路】动态规划
动态规划 https://blog.csdn.net/so_geili/article/details/53639920 最长公共子序列 https://blog.csdn.net/so_geili/ ...
- 【leetcode-198】打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个代表每 ...
- leetcode198之打家劫舍问题
问题描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给 ...
- LeetCode198 House Robber(打家劫舍)
题目 You are a professional robber planning to rob houses along a street. Each house has a certain amo ...
- dp练习--
动态规划(DP)算法 动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法.利用各个阶段之间的关系,逐个求解,最终求得全局最优解,需要确认原问题与子问题.动态规划状态.边界状态.边界状态 ...
- LeetCode practice
子集和问题:给定一组数和一个值,从这组数中选出若干个数使其和为给定的值.这是个NPC问题. 1.https://leetcode.com/problems/counting-bits/#/soluti ...
随机推荐
- 关于Java的特点之继承
继承--解决之道 继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类(比如刚才的Student),在父类中定义这些相同的属性和方法,所 ...
- CSS旋转缩放
<style type="text/css"> figure{ float: left;}.test1{ border-radius: 0px; height: 200 ...
- 分页控件 AspNetPager的使用
1.引用AspNetPager.dll插件 1.下载AspNetPager.dll插件到bin文件夹中. 2.在“引用中添加引用”(不然报错:未能在全局命名空间中找到类型或命名名空间名称“Wuqi”) ...
- 一十九条优雅Python编程技巧
1.交换赋值 #不推荐 temp = a a = b b = a #推荐 a , b = b , a #先生成一个元组(tuple)对象,然后在unpack 2.Unpacking #不推荐 l = ...
- 关于IT行业加班的问题
众所周知,所有行业中,IT行业加班最为严重,国内比较大的IT公司都有加班文化. 为什么要加班?有的时候加班是为了项目上线,因为正在运行的项目,在晚上的时候访问量是最小的,这个时候做系统更新是损失最小的 ...
- C# ModBus Tcp读写数据 与服务器进行通讯
前言 本文将使用一个NuGet公开的组件技术来实现一个ModBus TCP的客户端,方便的对Modbus tcp的服务器进行读写,这个服务器可以是电脑端C#设计的,也可以是PLC实现的,也可以是其他任 ...
- 本地Debug Asp.net MVC 无法加载css与js
运行一个从网上download的一个MVC项目,运行的时候无法显示样式,js也报错. 检查路径也没有问题,后来在配置中把其中的一段配置去掉 <staticContent> <!-- ...
- C#泛型中的抗变和协变
在.net4之前,泛型接口是不变的..net4通过协变和抗变为泛型接口和泛型委托添加了一个重要的拓展 1.抗变:如果泛型类型用out关键字标注,泛型接口就是协变的.这也意味着返回类型只能是T. 实例: ...
- oc语言的Foundation框架(学习笔记1)
Foundation框架 1.Foundation框架介绍 框架是由许多类.方法.函数以及文档按照一定的规则组合的起来的集合. cocoa程序编写主要用到2个框架Foundation和Applicat ...
- ESP8266EX资料
https://github.com/esp8266/Arduino http://espressif.com/zh-hans/support/explore/faq 电路资料图如下: 介绍功能: 参 ...