198、打家劫舍
动态规划问题
问题划分为n个小问题
若偷第n家,则偷的最大金额为前n-2家的最大金额加上第n家的金额
若不偷第n家,则偷的最大金额为前n-1家的最大金额
即dp[i] = max(dp[i-2]+num[i], dp[i-1])
其中dp[0]表示只有一间房屋,则dp[0] = num[0]
dp[1]表示只有两间房屋,dp[1]=max(num[0], num[1])
//打家劫舍
#include<iostream>
#include<string>
#include<vector>
using namespace std;
/*
问题划分为n个小问题
若偷第n家,则偷的最大金额为前n-2家的最大金额加上第n家的金额
若不偷第n家,则偷的最大金额为前n-1家的最大金额
即dp[i] = max(dp[i-2]+num[i], dp[i-1])
其中dp[0]表示只有一间房屋,则dp[0] = num[0] dp[1]表示只有两间房屋,dp[1]=max(num[0], num[1])
*/
int rob(vector<int>& nums) {
int n = nums.size();
int dp[100] = {0};
if(n==1)
return nums[0];
else if (n==2)
{
return max(nums[0], nums[1]);
}
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for(int i = 2; i<n; i++){
dp[i] = max(dp[i-1], dp[i-2] + nums[i]);
}
return dp[n-1];
}
int main()
{
int num[5] = {2,7,9,3,1};
vector<int> nums(num, num+5);
int result = rob(nums);
cout<<result<<endl;
return 0;
}