做完打家劫舍后我发现自己动态规划方面处理问题的能力,终于迎来了开篇,虽然打家劫舍是在我看网上的别的人做的,然后自己理解的,但是我知道我再遇到这类题不会再手足无措了,隔了两天再来挑战,我看看自己的动态规划能力是否有那么一点点,于是做了打家劫舍||,虽然我做了将近2个小时,但是庆幸的是自己依靠自己的能力做了出来,很感动,自己花了一晚上的时间做出来了,我都被自己感动的哭了,我算法如此垃圾,竟然能完全依靠自己的能力做出这个算法,真的很让我相信:天才是少数的,大多数人喜欢给自己的懒,找借口。好了不说,
说思路吧:
1.不让它收尾都取,只让它取其一,首端取了,尾端就不取,尾端取了首端就不取,然后在打家劫舍的基础上多声明一个数组,这个数组的取值是从原数组的尾端开始取值的,其实算法和打家劫舍一样,只不过我把打家劫舍的算法用了两遍,
2.上代码吧
public int rob(int[] nums) {
if (nums.length == 0) {
return 0;
}
if (nums.length == 1) {
return nums[0];
}
int max = Math.max(nums[0],nums[1]);
if (nums.length == 2) {
return max;
}
int[] f = new int[nums.length];
int[] n = new int[nums.length];
f[0] = nums[0];
f[1] = max;
n[nums.length-1] = nums[nums.length-1];
n[nums.length-2] = Math.max(nums[nums.length-1],nums[nums.length-2]);
for (int i = 2; i <nums.length-1 ; i++) {
f[i] = Math.max(f[i - 2] + nums[i], f[i - 1]);
}
for (int i = nums.length-3; i > 0; i--) {
n[i] = Math.max(n[i+2] + nums[i], n[i+1]);
}
if (f[nums.length-2] >= n[1]){
return f[nums.length-2];
}
return n[1];
}