leetcode--打家劫舍

题目:假如ihsi一个专业的小偷,准备计划去偷窃沿街边的房子,每个房子都藏有现金,唯一限制你偷窃的因素是偷窃警报系统,如果相连两个房子同一晚上都被小偷闯入,系统就会报警。

给定一个代表每个房子内现存有金额的非负整数数组,计算你在不触发警报系统的前提下可以盗窃最大的金额。

栗子①:

输入:nums=[1,2,3,1],输出:4.

解释:偷1号房子(1块)+偷3号房子(3块)

栗子②:

输入:nums=[3,1,1,4,1,6]

输出:13

解释:偷1号房子(3块)+偷4号房子(4块)+偷6号房子(6块)

大家完成下面的函数:

int rob(int* nums, int numsSize){

}

为了方便讲解,我这里创建了二维数组

答案:DP法

解释:dp[i][0]和dp[i][1]分别表示的是第i+1家房子选择没偷的话所持有的最高金额,第i+1家房子选择偷的话所持有的最高金额

每一家都可以选择偷与不偷,如果第i家选择没偷的话,那么第i-1家可以选择偷或者不偷。如果第i家选择偷的话,则第i-1家肯定不会偷,因为相邻连个房子只能偷一个,不然就会系统报警了。

1.dp[i][0]:如果第i+1家选择不偷,那么目前小偷手上所偷的金额最高肯定是在偷第di+1家之前所偷的金额,即dp[i-1][0]或者dp[i-1][1]。

2.dp[i][1]:如果选择偷的话,那么前一家房子肯定不会偷,则金额为前一家没偷所持有的最高金额加上偷现在这家额度金额,即dp[i-1][0]+nums[i]。

还需要去确定边界条件:

1.dp[0][0]=0,第一家选择不偷的话,手上的金额肯定为0

2.dp[0][1]=nums[0],第一家选择偷的话,手上的金额就是第一家存放的金额

最后写代码:

leetcode--打家劫舍_第1张图片

这是我第一次些的答案:

原理也是很简单,我是直接利用一维数组些的。

解释:dp[i]表示偷第i家手上所持有的最高金额。

原理还是一样的,可以选择偷与不偷,如果选择偷的话,那么前一个肯定不会偷,那么手上最高的金额是前一家之前所偷的金额加上这家的金额。如果选择不偷的话,那么手上最高的金额还是偷前一家所持有的最高金额。

边界条件:

一家也没偷的情况,即dp[0]=0.

偷第一家,即dp[1]=nums[0];

代码如下:

leetcode--打家劫舍_第2张图片

 

你可能感兴趣的:(c语言,数据结构与算法)