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的更多相关文章

  1. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  2. LeetCode198 House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  3. [Swift]LeetCode198. 打家劫舍 | House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  4. 【leetcode198 解题思路】动态规划

    动态规划 https://blog.csdn.net/so_geili/article/details/53639920 最长公共子序列 https://blog.csdn.net/so_geili/ ...

  5. 【leetcode-198】打家劫舍

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

  6. leetcode198之打家劫舍问题

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

  7. LeetCode198 House Robber(打家劫舍)

    题目 You are a professional robber planning to rob houses along a street. Each house has a certain amo ...

  8. dp练习--

    动态规划(DP)算法     动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法.利用各个阶段之间的关系,逐个求解,最终求得全局最优解,需要确认原问题与子问题.动态规划状态.边界状态.边界状态 ...

  9. LeetCode practice

    子集和问题:给定一组数和一个值,从这组数中选出若干个数使其和为给定的值.这是个NPC问题. 1.https://leetcode.com/problems/counting-bits/#/soluti ...

随机推荐

  1. jenkins 持续集成iOS开发

    持续集成即Continuous Integration,简称CI 1,安装jenkins,brew install jenkins 2,在浏览器输入localhost:8080会出现一个网页,要求输入 ...

  2. AFN\HTTPS\UIWebView

    1.AFN使用技巧 1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,再控制器中真正发请求的代码使用自己封装的工具类. 2.这样做的优点是以后如果修改了底层依赖的框架,那么我们修改 ...

  3. matplotlib画sin(x)和cos(x)/2

    import matplotlib.pyplot as mp 1. 基本的绘图 mp.plot(水平坐标, 垂直坐标, linestyle=线型, linewidth=线宽, color=颜色, .. ...

  4. 《深入.NET平台和C#编程》内部测试题-笔试试卷答案

    1)      以下关于序列化和反序列化的描述错误的是( C). a)      序列化是将对象的状态存储到特定存储介质中的过程 b)      二进制格式化器的Serialize()和Deseria ...

  5. node.js 调用第三方服务

    node作为客户端调用第三方服务   nodejs.cn/api 1. let http = require('http'); let util = require("util") ...

  6. SQL-记录删除篇-007

    删除记录: delete * from table_name 解释:删除表中的所有数据 delete * from table_name where id<10 解释:删除表中id小于10的数据 ...

  7. CH5702 Count The Repetitions

    题意 5702 Count The Repetitions 0x50「动态规划」例题 描述 定义 conn(s,n) 为 n 个字符串 s 首尾相接形成的字符串,例如: conn("abc& ...

  8. Python hashlib&hmac 模块

    用于加密相关的操作,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 hashlib模块示例: import hashlib m = hashlib. ...

  9. 计算apk包的安装之后占用空间以及运行时占用内存

    1.统计结果如下 计算apk安装占用空间大小方式 为了方式apk包运行时出现缓存数据等对空间计算造成影响.应该先进行安装,然后分别计算空间变化 所有apk包安装完毕后再运行 开启两个cmd窗口 第一个 ...

  10. 3.3-1933 problem A

    #include <stdio.h> int main(void){ int h; while(scanf("%d", &h) != EOF){ * (h-); ...