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;
}
posted @ 2024-01-11 18:41  不是孩子了  阅读(3)  评论(0编辑  收藏  举报