题目:
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.
大意:
在某个数组里面找一个序列, 序列里面的每一个元素都不能相邻,然后求其最大和
思路:
对于第n个房间,我们所有的选择是偷和不偷。
(1)、如果是偷,则上一步必须是不偷。那么,这一步的就是 maxV[i]=maxV[i-2]+nums[i] , nums[]是房子价值数组,nums[i]表示i位置房子价值。maxV[] 是一个和nums[]等大的数组,maxV[i]表征了到第i个房子位置,最大收益。
(2)、如果是不偷, 那么上一步就无所谓是不是已经偷过。所以maxV[i]=maxV[i-1]。
所以总而言之为maxV[i] = Math.max(maxV[i-2]+nums[i], maxV[i-1])。
代码:
package leetcode_1;
public class HouseRobber {
public static int rob(int[] nums) {
int n=nums.length;
if(n == 0)
return 0;
else if(n == 1)
return nums[0];
else
{
int[] maxV =new int[n];;
maxV[0] = nums[0];
maxV[1] = Math.max(nums[0], nums[1]);
for(int i = 2; i < n; i ++)
maxV[i] = Math.max(maxV[i-2]+nums[i], maxV[i-1]);
System.out.println(maxV[n-1]);
return maxV[n-1];
}
}
public static void main(String[] args) {
int[] nums={9,3,6,2,7,14,8,4};
rob(nums);
}
}