198. 打家劫舍
代码/思路
思路:
第三个元素之后,选择与否取决于选择之后和如果不选那种方案值最大
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() == 1)
{
return nums[0];
}
int f[101];
f[0] = nums[0];
f[1] = max(nums[0], nums[1]);
for(int i = 2; i < nums.size(); i++)
{
f[i] = max(f[i - 2] + nums[i], f[i - 1]);
}
return f[nums.size() - 1];
}
};
213. 打家劫舍 II
代码/思路
思路:
- 最后一个元素选择与否,取决于第一个元素选择与否
- 在打家劫舍I 的基础上增加一维
- dp[i][0] 代表第0个元素不选
- dp[i][1] 代表第0个元素选择
- 最后返回这两种情况的最大值即可
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
int dp[110][2];
//dp[i][0] 代表第0个元素不选
//dp[i][1] 代表第0个元素选择
if(n == 1)
{
return nums[0];
}
if(n == 2)
{
return max(nums[0], nums[1]);
}
dp[0][0] = 0;
dp[0][1] = nums[0];
for(int i = 1; i < n; i++)
{
for(int j = 0; j < 2; j++)
{
if(i == 1)
{
//如果第0个元素没有选
if(j == 0)
{
//那么最大值就是 0 + nums[1]
dp[i][j] = nums[1];