算法思路
1.确认原问题与子问题
原问题为求解N个房间的最优解,子问题为求解前1个,2个…n-1个房间的最优解。
2.确认状态
第i个状态即为前i个房间能够获得的最大财宝(最优解)
3.确认边界状态的值
前1个房间的最优解,第一个房间的财宝
前2个房间的最优解,第1,2个房间中较大的财宝
4.确定状态转移方程
a.选择第i个房间:第i个房间+前i-2个房间的最优解
b.不选择第i个房间:前i-1个房间的最优解
动态规划状态转移方程
dp[i]=max(dp[i-1],dp[i-2]+nums[i]);(i>=3)
对于[5 2 6 3 1 7]有:
设第i个房间的最优解为dp[i]
dp[1]=5
dp[2]=5
dp[3]=max(dp[1]+nums[3],dp[2])=max(5+6,5)=11
dp[4]=max(dp[2]+nums[4],dp[3])=max(5+3,11)=11
dp[5]=max(dp[3]+nums[5],dp[4])=max(11+1,11)=12
dp[6]=max(dp[4]+nums[6],dp[5])=max(11+7,12)=18
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==0)
{
return 0;
}
if(nums.size()==1)
{
return nums[0];
}
vector<int>dp(nums.size(),0);
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<nums.size();i++)
{
dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[nums.size()-1];//这里的返回值是数组中的最后一个
}
};