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

0 0
原创粉丝点击