题目:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 改为环形。
思路:
去掉前后,然后前后两次dp。
哈哈哈,自己想出来了,后期处理复杂。
窃取nb思路:
去掉第一个和最后一个进行两次dp。
最优值的情况
(1)含首不含尾。
(2)含尾不含头。
(3)都不含。
两次dp包含所有情况,正确。
代码:
class Solution {
public:
int rob(vector<int>& v) {
if(v.size()==0) return 0;
if(v.size()==1) return v[0];
if(v.size()==2) return max(v[0],v[1]);
if(v.size()==3) return max(v[2],max(v[0],v[1]));
if(v.size()==4) return max(v[0]+v[2],v[3]+v[1]);
vector<int> A1=v;
vector<int> A2=v;
A1[2]=v[2]+v[0];
A2[3]=v[3]+v[1];
for(int i=3;i<v.size()-1;i++)
{
A1[i]=max(A1[i-2]+v[i],A1[i-3]+v[i]);
}
for(int i=4;i<v.size();i++)
{
A2[i]=max(A2[i-2]+v[i],A2[i-3]+v[i]);
}
return max( max(A1[v.size()-3],A1[v.size()-2] ), max(A2[v.size()-1],A2[v.size()-2]) );
}
};