假设有一个强盗,在一条街上进行盗窃,一条街上有一排房子,每个房子中有一定数额的金钱,你不能同时打劫相邻的房子,求一晚上能打劫的最大“收益”。
分析:
- 有i个房子,每个房间金钱为W[i],从第1个房子开始盗窃,对每一个房子只有两种选择,偷或者是不偷。这里用dp[i]表示到第i个房子时,最大收益。
- 第i个房子,如果偷,则dp[i] = dp[i-2] + W[i],(i-2 是因为相邻房子不能偷,既然偷了i,则上一个最接近的房子应该是i-2)。如果不偷,则dp[i] = dp[i-1]。然后,我们需要对从这两种选择获取的收益进行比较,选取最大的一种,这样,状态转移方程就出来了,dp[i]=Math.max(dp[i-1],dp[i-2]+W[i])
- 接下来讨论方程的出口,也就是该方程什么时候可以结束。当i==0时,只有一个房子,那么我们必须偷,否则就什么都没有了,则dp[0]=W[0],当只剩2个房子时,只能从两个房子中选择一个房子,则dp[1] = Math.max(dp[0],dp[1])
代码实现:
public static void main(String args[]) {
int[] nums = {1,2,4,1,7,8,3};
int num = rob(nums);
System.out.println(num);
}
public static int rob(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
dp[1] = Math.max(nums[0], nums[1]);
for(int i=2;i<nums.length;i++) {
int A = dp[i-1];
int B = dp[i-2]+nums[i];
dp[i] = Math.max(A, B);
}
return dp[nums.length-1];
}