一.题目解析(打家劫舍1)

题目中提到不能偷相邻位置的东西
算法讲解
1.状态表示
f[i]表示到i位置时选择,打劫的最大钱财
g[i]表示到i位置时不选择,打劫的最大钱财
2.状态转移方程

3.初始化
观察状态转移方程就是0的位置会发生越界,所以考虑f[0],g[0]
f[0]表示到零位置选择打劫的总值,所以f[0]=nums[0]
同理g[0]=nums[0]
4.填表顺序
从左到右
5.返回值
return max(f[n-1],g[n-1])
二.代码实现
cpp
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
vector<int>f(n),g(n);
g[0]=0;f[0]=nums[0];
for(int i=1;i<n;i++)
{
f[i]=g[i-1]+nums[i];
g[i]=max(g[i-1],f[i-1]);
}
return max(g[n-1],f[n-1]);
}
};
三.题目解析(打家劫舍2)

原来的数组(房子)是相连的,现在我们将所有房子连成一个环

打家劫舍1在第一题中有详细讲解
打家劫舍2代码实现
cpp
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
return max(nums[0]+rob(nums,2,n-2),rob(nums,1,n-1));
}
int rob(vector<int>nums,int x,int y)
{
if(x>y)return 0;
int n=nums.size();
vector<int>f(n),g(n);
f[x]=nums[x];
for(int i=x+1;i<=y;i++)
{
f[i]=g[i-1]+nums[i];
g[i]=max(g[i-1],f[i-1]);
}
return max(f[y],g[y]);
}
};