链接:
题意
n个数字围成一圈,禁止取相邻,求能取到的最大值
解:
经典DP+特判/一丢丢思维
可以开个bool判断第一个取没取,然后判断最后一个,同样,再倒着做一遍即可
思维:把0到lg-2 和 1到lg-1各做一遍即可
实际代码:
c++
#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