链接:
213. 打家劫舍 II
题意
n个数字围成一圈,禁止取相邻,求能取到的最大值
解:
经典DP+特判/一丢丢思维
可以开个bool判断第一个取没取,然后判断最后一个,同样,再倒着做一遍即可
思维:把0到lg-2 和 1到lg-1各做一遍即可
实际代码:
#include<bits/stdc++.h>
using namespace std;
int rob(vector<int>& nums)
{int lg=nums.size();vector<int>nums1(lg),nums2(lg);if(lg==1) return nums[0];if(lg==2) return max(nums[0],nums[1]);nums1[0]=nums[0];nums1[1]=max(nums[0],nums[1]);for(int i=2;i<lg-1;i++){nums1[i]=max(nums1[i-1],nums1[i-2]+nums[i]);}nums2[1]=nums[1];nums2[2]=max(nums[1],nums[2]);for(int i=3;i<lg;i++){nums2[i]=max(nums2[i-1],nums2[i-2]+nums[i]);}return max(nums1[lg-2],nums2[lg-1]);
}
限制:
1 <= nums.length <= 100
0 <= nums[i] <= 1000