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. 添加网络打印机的步骤(xp和win2008+win7)

    1.如题,设置好打印机的 ip地址和子网掩码等信息. 2 .xp不像其他新的系统那么好用那么智能...只能慢慢来 如果是xp,注意,请添加网络打印机的时候选  :添加本地打印机,,记得哦 然后如图 然 ...

  2. ECB cspk7 加密

    public function test(){ $param = input('param.'); // $input = 'userid=7&gameid=100107&buycou ...

  3. 剑指Offer 13. 调整数组顺序使奇数位于偶数前面 (数组)

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 题目地址 https ...

  4. webapp 安卓 ios 兼容性问题

    1.ios js中时间不兼容YYYY-MM-DD这种格式的时间,只支持YYYY/MM/DD这种格式 // 在safari中new Date('2018-09-02') // Invalid Daten ...

  5. vs2017 使用Bower 抛出异常ECMDERR Failed to execute "git ls-remote --tags --heads

    今天在使用Bower来下载vue包的时候,发现无法正常价新型,并且在输出窗口有以下提示 ECMDERR Failed to execute "git ls-remote --tags --h ...

  6. 拓扑排序bfs_dfs

    dfs #include <cstdio> #include <cstring> using namespace std; ; struct Edge{ int lst; in ...

  7. SuSE Linux Enterprise Server - 软件包下载地址

    官方地址: https://software.opensuse.org

  8. 学习笔记TF015:加载图像、图像格式、图像操作、颜色

    TensorFlow支持JPG.PNG图像格式,RGB.RGBA颜色空间.图像用与图像尺寸相同(height*width*chnanel)张量表示.通道表示为包含每个通道颜色数量标量秩1张量.图像所有 ...

  9. java_lambda表达式

    lambda表达式1    由来    概念        是通过策略模式来曲线实现的    lambda表达式2    语法详解    lambda表达式3    目标类型的概念    目标类型推断 ...

  10. Maven项目中在properties 中使用 ${} 来引用pom文件中的属性

    比如在pom文件中定义了属性如下: <jdbc.host.global>127.0.0.1</jdbc.host.global> <jdbc.databasename.g ...