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. 剑指Offer 25. 复杂链表的复制 (链表)

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

  2. L2-008. 最长对称子串(思维题)*

    L2-008. 最长对称子串 参考博客 #include <iostream> using namespace std; int main() { string s; getline(ci ...

  3. 自动化测试-11.selenium的下拉框处理类Select

    前言 最近由于工作原因,更新慢了一点,今天终于抽出一点时间给大家继续更新selenium系列,学习的脚本不能停止,希望小伙伴能多多支持. 本篇以百度设置下拉选项框为案例,详细介绍select下拉框相关 ...

  4. Address localhost:1099 is already in use

    在 ItelliJ idea中创建了Servlet,启动tomcat时系统报错: Error running Tomcat 7.0.47: Address localhost:1099 is alre ...

  5. bzoj 2460 线性基

    #include<bits/stdc++.h> #define ll long long #define LL long long #define int long long using ...

  6. .NET平台

    .nat 是一种跨语言的平台 类跟对象回顾 由于对象归纳类 是归纳对象共性的过程 在类似的基础上  将状态和行为实体话为对象的过程称为实例话 只写属性   只包含set访问器 只读属性  只包含get ...

  7. POJ1821 Fence

    题意 Language:Default Fence Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6478 Accepted: ...

  8. 2.4 Visio2007显示动态对齐网格

  9. Spring Cloud(Dalston.SR5)--Zuul 网关-过滤器

    Spring Cloud 为 HTTP 请求的各个阶段提供了多个过滤器,这些过滤器的执行顺序由各自提供的一个 int 值决定,提供的值越小则优先级越高,默认的过滤器及优先级如下: 自定义过滤器 在默认 ...

  10. Oauth2.0客户端服务端示例

    https://blog.csdn.net/qq_28165595/article/details/80459185 前言前面的理解OAuth2.0认证与客户端授权码模式详解,我们大致了解了Oauth ...