You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

  • 动态规划,设置maxV[i]表示到第i个房子位置,最大收益。
  • 递推关系为maxV[i] = max(maxV[i-2]+num[i], maxV[i-1])
class Solution {
public:
int rob(vector<int> &num) {
int n = num.size();
if(n == )
return ;
else if(n == )
return num[];
else
{
vector<int> maxV(n, );
maxV[] = num[];
maxV[] = max(num[], num[]);
for(int i = ; i < n; i ++)
maxV[i] = max(maxV[i-]+num[i], maxV[i-]);
return maxV[n-];
}
}
};
  • 用A[0]表示没有rob当前house的最大money,A[1]表示rob了当前house的最大money,那么A[0] 等于rob或者没有rob上一次house的最大值
  • 即A[i+1][0] = max(A[i][0], A[i][1])..  那么rob当前的house,只能等于上次没有rob的+money[i+1], 则A[i+1][1] = A[i][0]+money[i+1]. 只需要两个变量保存结果就可以了
int max(int a, int b)
{
if(a > b)
return a;
else
return b;
}
int rob(int* nums, int numsSize) {
int best0 = ; // 表示没有选择当前houses
int best1 = ; // 表示选择了当前houses
for(int i = ; i < numsSize; i++){
int temp = best0;
best0 = max(best0, best1); // 没有选择当前houses,那么它等于上次选择了或没选择的最大值
best1 = temp + nums[i]; // 选择了当前houses,值只能等于上次没选择的+当前houses的money
}
return max(best0, best1);
}

After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

  • 把第一个房子,作为例外处理

    • 如果选择第一个房子,则从第三个房子开始到倒数第二房子,属于常规
    • 如果不选第一个房子,则从第二个房子开始属于常规
int rob(int* nums, int numsSize) {
if(numsSize == )
return ;
//分成第一家抢和不抢
//如果第一家不抢,最后一个就不用考虑抢不抢
int hos11 = nums[];
int hos10 = ;
int best1 = ; //rub cur house
int best0 = ; //not rub cur house
for(int i = ; i < numsSize - ; i++){
int tmp = best0;
best0 = best1 > best0 ? best1 : best0;
best1 = tmp + nums[i];
}
hos11 += best1 > best0 ? best1 : best0;
//如果第一家抢,最后一家不能抢,返回倒数第二家的情况
best1 = ;
best0 = ;
for(int i = ; i < numsSize; i++){
int tmp = best0;
best0 = best1 > best0 ? best1 : best0;
best1 = tmp + nums[i];
}
hos10 = best1 > best0 ? best1 : best0;
return hos11 > hos10 ? hos11 : hos10;
}

House Robber & House Robber II的更多相关文章

  1. LeetCode之“动态规划”:House Robber && House Robber II

    House Robber题目链接 House Robber II题目链接 1. House Robber 题目要求: You are a professional robber planning to ...

  2. 【leetcode】House Robber & House Robber II(middle)

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

  3. [LeetCode] House Robber II 打家劫舍之二

    Note: This is an extension of House Robber. After robbing those houses on that street, the thief has ...

  4. [LeetCode] 213. House Robber II 打家劫舍之二

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

  5. LeetCode House Robber III

    原题链接在这里:https://leetcode.com/problems/house-robber-iii/ 题目: The thief has found himself a new place ...

  6. [LintCode] House Robber II 打家劫舍之二

    After robbing those houses on that street, the thief has found himself a new place for his thievery ...

  7. 198. House Robber,213. House Robber II

    198. House Robber Total Accepted: 45873 Total Submissions: 142855 Difficulty: Easy You are a profess ...

  8. [LeetCode]House Robber II (二次dp)

    213. House Robber II     Total Accepted: 24216 Total Submissions: 80632 Difficulty: Medium Note: Thi ...

  9. House Robber I & II & III

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

随机推荐

  1. poj2488 A Knight's Journey

      A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24840   Accepted:  ...

  2. jQuery提交form表单

    <form id="search_form" name="search_form" method="post"> <inp ...

  3. 新闻公布系统 (Asp.net 三层架构 )

    2012年度课程设计---新闻公布系统(小结)                                                                             ...

  4. [Django实战] 第3篇 - 用户认证(初始配置)

    当大家打开一个网站时,第一步做什么?大部分一定是先登录吧,所以我们就从用户认证开始. 打开用户认证 Django本身已经提供了用户认证模块,使用它可以大大简化用户认证模块的开发,默认情况下,用户认证模 ...

  5. CXF interceptor拦截顺序

    CXF Interceptor中Phase的先后顺序 org.apache.cxf.phase.PhaseManagerImpl中 final void createInPhases() { int  ...

  6. 使用 hibernate 根据映射文件生成数据库表

    为了更好的显示效果,可以在hibernate.cfg.xml配置文件的<session-factory>标签里加入以下内容: 显示sql语句和格式化显示sql语句: <propert ...

  7. Magnolia-CMS安装配置

    Magnolia-CMS安装配置 Magnolia-CMS安装配置 介绍:Magnolia 是一个开源基于Java的Web内容管理系统(CMS),构建在Java内容知识库标准(JSR-170).它适合 ...

  8. Scala基础入门-1

    首先需要Scala开发环境的搭建,网上自己找教程. 声明常量与变量 val foo = 0 // 常量 var bar = 0 // 变量 在Scala中,更加鼓励使用val来进行声明,也就是推荐使用 ...

  9. mysql5.7慢查询开启配置

    1.问题 当然又被度娘(我冤枉)坑了噻,网友说配置文件写下面三行: log-slow-queries=D:\Program Files\mysql-5.7.11-winx64\data\low.log ...

  10. Hibernate摘记

    原理: 1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.xml中的<mapping reso ...