问题描述:

意思就是说:给定一个数组,寻找一种选取方法,使得在保证任何两个相邻元素不同时被选的条件下得到的数值总和最大。

1. 递归

  设nums为数组首地址,numsSize为数组的大小,max[i]表示从第i(0 <= i < numsSize)个元素开始所能得到的最大值。则原问题描述为求max[0]。

  

  其中nums[i]+max[i+2]表示选择第i个元素,因此第i+1个元素不能选择;max[i+1]表示不选择第i个元素,而max[i+1]=max{nums[i+1]+max[i+3], max[i+2]},很明显max[i+2]小于nums[i]+max[i+2],因此:

  

  加上边界控制语句,代码如下:

 int maxMoney ( int *nums, int numsSize, int startIndex) {
     if ( startIndex >= numsSize ) {
         ;
     } ) {
         return *(nums+startIndex);
     }
     );
     ) + maxMoney(nums, numsSize, startIndex+);
     return first>second?first:second;
 }

 int rob(int* nums, int numsSize) {
     ) {
         ;
     }  ) {
         return *nums;
     }  ) {
         )? *nums : *(nums+);
     }
     );
     ) + maxMoney(nums, numsSize, );
     return first>second?first:second;
 }

2. 迭代

  当i=numsSize-1(表示只剩下最后一个元素的时候),最大的只即为nums[i];

  当i=numsSzie-2(剩下最后两个元素的时候,下文其它情况依次类推),最大的情况是nums[i](选择numsSize-2)或nums[i+1](选择numsSize-1);而nums[i+1]已经在i=numsSize-1的时候进行了分析,因此不用再重复;

  当i=numsSize-3时,最大值只可能是

    1. nums[i]+nums[i+2],或者
    2. nums[i+1];

  而nums[i+1](即nums[numsSize-2])已经在第二步计算过,因此只需要记录nums[i]+nums[i+2]的值;

  ……

  下表是一个简单的分析过程,一些不可能出现最大值的情况没有写出来。

  通过上述分析可知,求max[i]时,不选择第i个元素的情况(即max[i+1])已经计算过,因此只需要增加选择第i个元素的情况,那么最终的结果就是这两个值中较大的。

  而对于选择i的情况,第i+1元素由于限制条件将不能选择,因此第i+2个元素可以选可以不选:

    1. 如果选择第i+2个元素,则max[i]=nums[i]+max[i+2];
    2. 如果不选择第i+2个元素,则i+3个元素将必须选择(因为如果不选,则将出现连续3个元素没有选择的情况,这样无论如何都不可能得到一个整体最优的值),则max[i]=nums[i]+max[i+3]

  由于max[i+2]和max[i+3]已经计算出来,因此选择其中一个最大的值作为max[i]的结果。

  这样可以计算出max中所有元素的值,但所有的值都是选择当前假设条件下第一个元素的情况,不选择当前元素的情况即为前一次计算的结果。最终的结果即为max[0]和max[1]中较大的。

 int rob(int* nums, int numsSize) {
      ) {;}
      ) {];}

     , temp2 = ;
      ) {
         temp1 = nums[];
         temp2 = nums[];
         return temp1 > temp2 ? temp1 : temp2;
     } ) {
         temp1 = nums[] + nums[];
         temp2 = nums[];
         return temp1 > temp2 ? temp1 : temp2;
     } else {
         // maxValue[i] 表示选择第i个的最大值
         int *maxValue = (int*)malloc(numsSize * sizeof(int));
         maxValue[numsSize-] = nums[numsSize-];
         maxValue[numsSize-] = nums[numsSize-];
         maxValue[numsSize-] = nums[numsSize-] + nums[numsSize-];
         ; i >= ; i--) {
             temp1 = nums[i] + maxValue[i+];
             temp2 = nums[i] + maxValue[i+];
             maxValue[i] = temp1 > temp2 ? temp1 : temp2;
         }
         // maxValue[0]对应第一个(下标为0)选择的最大值,maxValue[1]对应第1个不选择的最大值
         ] > maxValue[] ? maxValue[] : maxValue[];
     }
 }

LeetCode Day5——House Robber的更多相关文章

  1. Leetcode 337. House Robber III

    337. House Robber III Total Accepted: 18475 Total Submissions: 47725 Difficulty: Medium The thief ha ...

  2. [LeetCode] 213. House Robber II 打家劫舍 II

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

  3. [LeetCode] 337. House Robber III 打家劫舍 III

    The thief has found himself a new place for his thievery again. There is only one entrance to this a ...

  4. leetcode:House Robber(动态规划dp1)

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

  5. [LeetCode] 337. House Robber III 打家劫舍之三

    The thief has found himself a new place for his thievery again. There is only one entrance to this a ...

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

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

  7. [LeetCode] 198. House Robber 打家劫舍

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

  8. 【leetcode】House Robber

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

  9. Leetcode 198 House Robber

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

随机推荐

  1. UML图总结

    UML叙述 UML文档仅仅是设计与开发人员采用UML语言进行系统分析与设计的结果,并没有给出如何进行开发和采用何种开发流程,同样也不指导如何进行面向对象设计. UML文档描述了面向对象分析与设计的结果 ...

  2. C# StreamReader/StreamWriter与FileStream用法详解

    http://www.360doc.com/content/13/0610/08/12579422_291878973.shtml

  3. hdu1573X问题(不互素的中国剩余定理)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  4. STL之nth_element()(取容器中的第n大值)

    nth_element()函数 头文件:#include<algorithm> 作用:nth_element作用为求第n大的元素,并把它放在第n位置上,下标是从0開始计数的,也就是说求第0 ...

  5. Python 练习 —— 2048

    1. 引言 2048 这段时间火的不行啊,大家都纷纷仿造,"百家争鸣",于是出现了各种技术版本号:除了手机版本号,还有C语言版.Qt版.Web版.java版.C#版等,刚好我接触P ...

  6. Javascript进阶篇——(JS基础语法)笔记整理

    根据慕课网学习整理到一起的笔记,把东西整理到一起看起来比较方便 什么是变量字面意思:变量是可变的量:编程角度:变量是用于存储某种/某些数值的存储器.我们可以把变量看做一个盒子,盒子用来存放物品,物品可 ...

  7. 疯狂Android第一章:Android环境配置以及基本概念

    第一章 无关痒痛:Android Studio安装,配置,基本功能介绍! 重点内容:Android应用基本结构分析. 基础概念部分(只需知道作用,原理后见代码): Activity:安卓系统中负责与用 ...

  8. ANCS协议翻译

    综述 苹果通知中心(Apple Notification Center Service, ANCS)的目的是提供给蓝牙外设一种简单.方便的获取ios设备通知信息的方式. 依赖 ANCS的使用没有依赖, ...

  9. ps 网页布局

    910  1680  找一个页面作为参考   双击小手回到正常视角 新建组  把他们放到一个组里  新建组改名(创意专家)  放入一个图片 内发光投影  Shiftalt  复制 新建组  改名创意案 ...

  10. 一个完整的SSL连接建立过程

    客户端浏览器连接到Web服务器,发出建立安全连接通道的请求. 服务器接受客户端请求,发送服务器证书做为响应. 客户端验证服务器证书的有效性,如果验证通过,则用服务器证书中包含的服务器公钥加密一个会话密 ...