强盗抢房子(II)
Posted 雪浪snowWave
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了强盗抢房子(II)相关的知识,希望对你有一定的参考价值。
题目:和之前一道抢房子一样,区别是增加了一个条件,房子是环形分布的,就是说不能同时偷第一个和最后一个,因为他们也是挨着的。。
思路:最优解很巧妙的想法,我们已经算过直线分布的了,那么环形分布和直线分布是不是有什么相似之处呢??其实直线分布如果在后面加一个财宝为0的房子,就是环形分布。环形分布只要去掉第一个或者最后一个,就是直线分布。。所以我们分别求第一个到倒数第二个房子区间获得的最大值和第二个到最后一个房子获得的最大值,取两者最大即可。。。
public int rob(int[] nums) { int n=nums.length; if(n==0) return 0; if(n ==1) return nums[0]; if(n==2) return Math.max(nums[0],nums[1]);
//0到n-2就是第一个到倒数第二个房子
//1到n-1就是第二个到最后一个房子
return Math.max(f(nums,0,n-2),f(nums,1,n-1)); } private static int f(int[] nums,int s,int e){ int n=nums.length; int[] dp=new int[e-s+1]; dp[0]=nums[s]; dp[1]=Math.max(dp[0],nums[s+1]); for(int i=2;i<e-s+1;i++){ dp[i]=Math.max(dp[i-2]+nums[s+i],dp[i-1]); } return dp[e-s]; }
以上是关于强盗抢房子(II)的主要内容,如果未能解决你的问题,请参考以下文章
2016 NEERC, Northern Subregional Contest G.Gangsters in Central City(LCA)