198 House Robber
来源:互联网 发布:软件知识产权包括哪些 编辑:程序博客网 时间:2024/05/16 19:55
198 House Robber
连接:https://leetcode.com/problems/house-robber/
问题描述:
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.
Credits:
Special thanks to @ifanchu for adding this problem and creating all test cases. Also thanks to @ts for adding additional test cases.
这是一个寻找最优解的问题,我们可以用动态规划的问题来解决这个问题。解决动态规划问题基本步骤如下:
动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图所示。动态规划的设计都有着一定的模式,一般要经历以下几个步骤。
初始状态→│决策1│→│决策2│→…→│决策n│→结束状态
(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。
(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。
(3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。
(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。一般,只要解决问题的阶段、状态和状态转移决策确定了,就可以写出状态转移方程(包括边界条件)。
实际应用中可以按以下几个简化的步骤进行设计:
(1)分析最优解的性质,并刻画其结构特征。
(2)递归的定义最优解。
(3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值
(4)根据计算最优值时得到的信息,构造问题的最优解
在这个问题中,nums[i]表示抢劫第i户人家的收益,r[i]表示在0到i户人家中的确定抢劫第i户人家的最大收益,nr[i]表示在0到i户人家中的确定不抢劫第i户人家的最大收益。那么在第i户人家,如果不抢劫,那么nr[i]=r[i-1]。如果想要抢劫那么要判断如果nr[i-1]+nums[i]>r[i-1],那么r[i]=nr[i-1]+nums[i],如果nr[i-1]+nums[i]<=r[i-1],那么 r[i]=r[i-1]。遍历完毕后只需要返回r[]和nr[]最后一个元素中大的一个就可以。
int rob(int* nums, int numsSize) { if(0==numsSize) return 0;int *r,*nr; r=(int *) malloc(numsSize * sizeof(int));; nr=(int *) malloc(numsSize * sizeof(int));; nr[0]=0; r[0]=nums[0]; for(int i=1;i<numsSize;i++) { nr[i]=r[i-1]; r[i]= (nr[i-1]+nums[i]>r[i-1])? nr[i-1]+nums[i]:r[i-1]; } int res=(r[numsSize-1]>nr[numsSize-1])?r[numsSize-1]:nr[numsSize-1]; free(r); free(nr); return res;}
参考博客:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741374.html
http://blog.csdn.net/canglingye/article/details/44853375
- Leetcode 198: House Robber
- 198House Robber
- leetcode-198 House Robber
- [LeetCode 198]House Robber
- 198 House Robber
- House Robber - LeetCode 198
- leetcode 198 House Robber
- 198 House Robber
- leetCode #198 House Robber
- LeetCode 198-House Robber
- Leetcode[198]-House Robber
- 【Leetcode】House Robber #198
- Leetcode 198 House Robber
- leetcode 198:House Robber
- House Robber (leetcode 198)
- 【LeetCode】198:House Robber
- leetcode[198]:House Robber
- leetcode-198-House Robber
- Java web基础总结一之—— xml基础
- windows下PATH到底能有多长?
- 文章标题
- MySQL源码里的缩写
- Android Studio添加so文件并打包到APK的lib文件夹中
- 198 House Robber
- Android字体描边
- Effective C++学习笔记(1)
- Android学习之——实现圆角Button
- mysql 线程等待时间,解决sleep进程过多的办法
- 登录iis7 网站服务器上网站网页可以访问 但远程访问网站网页不能访问的解决方法
- 创建GZIP压缩格式的HIVE表
- 推荐一款 表情插件《jQuery QQ表情插件jquery.qqFace.js》
- JavaScript的函数传值