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. 学习python的字符串的方法

    今天看了下学习视频,发现str也有许多方法,才发现昨天了解的关于字符串知识甚少,所以今天查看了python的源码,学习一些新的方法 以下是我把边对照着源码边翻译,边尝试实现方法 1.第一个字符有大写字 ...

  2. css 长用点

    功能 :     font-size: 0;        去除图片之间空白空隙

  3. css 文本超出范围显示省略号

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 自动化测试-12.selenium的弹出框处理

    前言 不是所有的弹出框都叫alert,在使用alert方法前,先要识别出到底是不是alert.先认清楚alert长什么样子,下次碰到了,就可以用对应方法解决. alert\confirm\prompt ...

  5. linux基础命令一

    linux基础命令一 1.date命令 date命令介绍:显示或者设置系统日期 date命令的语法: 显示日期:date  [options...]  [+FORMAT] FORMAT:为显示日期的格 ...

  6. github/gitee使用办法

    github/gitee只要添加SSH公钥都是可以连接上的 比如把某个文件上传gitee 首先肯定要有权限    否则会一直提醒failed伤心心 接下来说常用语句 git config --list ...

  7. mingw using pthread

    转载http://www.cnblogs.com/tfanalysis/p/5505163.html ftp://sourceware.org/pub/pthreads-win32/ 有的时候需要使用 ...

  8. 乐乐课堂_leleketang.com

    乐乐课堂_leleketang.com https://www.baidu.com/sf?pd=video_page&sign=12394301609542619800&word=抛物 ...

  9. Linux eclipse 编译C++

    1.软件安装 2.新建C++工程 3.输入新建文件夹的名字 4.新建main.cpp文件 5.编辑main.cpp #include<iostream> int main(){ std:: ...

  10. eclipse开启时报错问题

    eclipse启动时报如下错误: Unable to read workbench state.Workbench UI layout will be reset 不能找到正式的工作台,工作台UI的布 ...