这道题相比来说是比较简单的,它其实就是将大的问题分为子问题,保证子问题最优,累计达到最优解。回到题目,这道题说,小偷偷了这一家人,就偷不了前一家和后一家的人,那么核心就在于偷不偷这一家人,偷痛失前后两家的收益,不偷则失去这一家的收益, 为了简单,我们可以 设定拿出三个的数组dp[1,2,3],dp的最大的收益是 dp[0]+dp[3] 或者是dp[2],所以我们的每一个计算最大的收益都是两者比较的值的累计之。
做法如下,我们从第三个只要我们每次获得上上一个,上一个和自己的最大值,就可以获得自己的最大收益,再用数组存起来,最后一个的值,就是最后的收益。
package DP;
/**
*
*
*
* */
public class demo7 {
public static void main(String[] args) {
System.out.println(demo7.rob(new int[]{1, 2, 3}));
}
public static int rob (int[] nums) {
//dp[i]表示长度为i的数组,最多能偷取多少钱
int[] dp = new int[nums.length + 1];
//长度为1只能偷第一家
dp[1] = nums[0];
int i;
System.out.println(dp[1]);
for (i = 2; i <= nums.length; i++){
//比较 dp[i - 1]代表上一家的收益
//dp[i-2]等于上上一家的 nums[i - 1]代表为中间的值(因为dp的数组索引比num大了一位,所以num[i-1]代表的是当前的值)
dp[i] = Math.max(dp[i - 1], nums[i - 1] + dp[i - 2]);
}
return dp[nums.length];
}
}