一、题目
二、代码
class Solution
{
public int rob(int[] nums)
{
int i;
int length = nums.length;
if(length==1) return nums[0];
if(length==2) return Math.max(nums[0],nums[1]);
if(length==3) return Math.max(nums[0],Math.max(nums[1],nums[2]));
int[] dp = new int[length];
//三种情况 都算一遍就好了
//偷第一家
dp[0] = nums[0];
dp[1] = nums[0];
for(i=2;i<=length-2;i++)
{
dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
}
dp[length-1] = dp[length-2];
//偷最后一家
int[] dp_last = new int [length];
dp_last[0]=0;
dp_last[1] = nums[1];
for(i=2;i<=length-3;i++)
{
dp_last[i] = Math.max(dp_last[i-2]+nums[i],dp_last[i-1]);
}
dp_last[length-1] = dp_last[length-3]+nums[length-1];
//两家都不偷
int[] dp_none = new int[length];
dp_none[0] = 0 ;
dp_none[1] = nums[1];
for(i=2;i<=length-2;i++)
{
dp_none[i] = Math.max(dp_none[i-2]+nums[i],dp_none[i-1]);
}
dp_none[length-1] = dp_none[length-2];
return Math.max(dp[length-1],Math.max(dp_last[length-1],dp_none[length-1]));
}
}
三、运行结果
四、附录
二刷
class Solution
{
public int rob(int[] nums)
{
int i,j;
//两种偷法 偷第一家和不偷第一家
int length = nums.length;
int[] res = new int[length];
//第一家偷
res[0] = nums[0];
if(length==1) return res[0];
res[1] = nums[0];
//System.out.print(" "+" i 0 "+" "+res[0]);
//System.out.print(" "+" i 1 "+" "+res[1]);
for(i=2;i<length-1;i++)
{
res[i] = Math.max(nums[i]+res[i-2],res[i-1]);
System.out.print(" "+" i "+i+" "+res[i]);
}
res[length-1] = res[length-2];
//System.out.print(" "+" i "+i+" "+res[i]);
//第一家不偷
//System.out.println(" ");
//System.out.println(" 分割 ");
int[] res_2 = new int[length];
res_2[0] = 0;
res_2[1] = nums[1];
//System.out.print(" "+" i 0 "+" "+res_2[0]);
//System.out.print(" "+" i 1 "+" "+res_2[1]);
for(i=2;i<length;i++)
{
res_2[i] = Math.max(nums[i]+res_2[i-2],res_2[i-1]);
System.out.print(" "+" i "+i+" "+res_2[i]);
}
return Math.max(res[length-1],res_2[length-1]);
}
}