LeetCode Day5——House Robber
问题描述:

意思就是说:给定一个数组,寻找一种选取方法,使得在保证任何两个相邻元素不同时被选的条件下得到的数值总和最大。
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时,最大值只可能是
- nums[i]+nums[i+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个元素可以选可以不选:
- 如果选择第i+2个元素,则max[i]=nums[i]+max[i+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的更多相关文章
- Leetcode 337. House Robber III
337. House Robber III Total Accepted: 18475 Total Submissions: 47725 Difficulty: Medium The thief ha ...
- [LeetCode] 213. House Robber II 打家劫舍 II
Note: This is an extension of House Robber. After robbing those houses on that street, the thief has ...
- [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 ...
- leetcode:House Robber(动态规划dp1)
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- [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 ...
- [LeetCode] 213. House Robber II 打家劫舍之二
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- [LeetCode] 198. House Robber 打家劫舍
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- 【leetcode】House Robber
题目简述 You are a professional robber planning to rob houses along a street. Each house has a certain a ...
- Leetcode 198 House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
随机推荐
- UGUI Text控件
学习UGUI的Text控件,用于显示文本!. 基本属性就不再啰嗦了! Alignment: 文字以 水平和垂直 对齐方式, Horizontal Overflow: 水平 Wrap: 文字大小和数量 ...
- Unity 生命周期
原文翻译: Execution Order of Event Functions 事件函数的执行顺序 Edit ...
- java实现写大量数据到文件中
生成.txt文件 生成.csv文件 生成.xls文件 import java.io.BufferedWriter; import java.io.File; import java.io.FileOu ...
- ArcSDE for Oracle表空间管理——暂时(TEMP)表空间
Oracle暂时表空间主要用来做查询和存放一些缓冲区数据.暂时表空间消耗的主要原因是须要对查询的中间结果进行排序. 重新启动数据库能够释放暂时表空间,假设不能重新启动实例,而一直保持问题sql语句的运 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- Android 四大组件之 BroadcastReceiver
0 简介 BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的 广播. 在Android系统中,广播体现在方方面面,例 ...
- LR实战之Discuz开源论坛——登录场景设计
以下是根据个人项目经验,对登录场景的设计,如下步骤: 一.打开Controller,添加登录脚本,选择“手动场景”,一般我们项目中经常使用的是“手动场景”类型设计,如图 二.在“设计”部分,设置场景的 ...
- C#入门(一):IDE
设计流程 .NET可视化对象 创建工程的时候,会创建三个文件 Form1.cs Form1.Designer.cs Program.cs 当增加一个控件的时候,会在Form1.Designer.cs增 ...
- Log4Net配置 转
http://www.cnblogs.com/qingyi/archive/2010/01/14/1647915.html 用一些东西老是忘记,先记在这啦.. <!--log4net相关说明一. ...
- asp.net中Repeart选中整行操作
<asp:Repeater runat="server" ID="rpt_Student"> <HeaderTemplate> < ...