刷爆leetcode Day8 DP

11. 按摩师(easy)

https://leetcode.cn/problems/the-masseuse-lcci/submissions/575467387/

class Solution {
public:
    int massage(vector<int>& nums) {
        int n=nums.size();
        if(n==0)//处理边界情况
        return 0;
        vector<int> fdp(n);//当前位置选择预约
        vector<int> gdp(n);//当前位置不选择预约
        fdp[0]=nums[0];
        gdp[0]=0;
        for(int i=1;i<n;i++)
        {
            fdp[i]=gdp[i-1]+nums[i];
            gdp[i]=max(gdp[i-1],fdp[i-1]);
        }
        return max(fdp[n-1],gdp[n-1]);
    }
};

12. 打家劫舍II(medium)

https://leetcode.cn/problems/house-robber-ii/description/

class Solution {
public:
    int _rob(vector<int>& nums,int left,int right)
    {
        if(left>right)return 0;//处理边界情况
        int n=nums.size();//尽管不需要开这么大空间,但这样可以让nums下标与dp表下标相同,否则要去映射了
        vector<int> fdp(n);
        vector<int> gdp(n);
        fdp[left]=nums[left];
        gdp[left]=0;
        for(int i=left+1;i<=right;i++)
        {
            fdp[i]=gdp[i-1]+nums[i];
            gdp[i]=max(gdp[i-1],fdp[i-1]);
        }
        return max(fdp[right],gdp[right]);
    }
    int rob(vector<int>& nums) {
        //类似上一道题,不过就是当我们选择0位置时我们也不能选择最后一个位置
        //分为两种情况选择第一个位置和不选择选择第一个位置
        //第一种情况第二个位置和最后一个位置不选,区间变为[2,3,......,n-2]
        //第二种情况区间变为[1,2,3,...,n-1]
        int n=nums.size();
        return max(nums[0]+_rob(nums,2,n-2),_rob(nums,1,n-1));
    }
};

13. 删除并获得点数(medium)

https://leetcode.cn/problems/delete-and-earn/submissions/575477083/

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        //倘若数组元素都是相邻的我们就可以沿用上题的操作
        //也许我们可以通过排序将相邻的元素按顺序
        //但是遗憾的是数组中会缺少某些相邻的元素
        //我们可以通过一个新数组的下标去映射原数组,因为数组的下标是相邻的
        const int array_max=10001;
        vector<int> hash(array_max);
        for(auto ch:nums)
        hash[ch]+=ch;
        vector<int> fdp(array_max);
        vector<int> gdp(array_max);
        fdp[0]=hash[0];
        for(int i=1;i<array_max;i++)
        {
            fdp[i]=gdp[i-1]+hash[i];
            gdp[i]=max(gdp[i-1],fdp[i-1]);
        }
        return max(gdp[array_max-1],fdp[array_max-1]);
    }
};

14. 粉刷房⼦(medium)

https://leetcode.cn/problems/JEj789/submissions/575481018/

class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
        //当前房子粉刷某种颜色取决于上一个房子粉刷了什么颜色
        int m=costs.size();
        vector<vector<int>>dp (m,vector<int>(3));
        dp[0][0]=costs[0][0];//第一个房子涂红
        dp[0][1]=costs[0][1];//第一个房子涂蓝
        dp[0][2]=costs[0][2];//第一个房子涂绿
        for(int i=1;i<m;i++)
        {
            dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i][0];//当前房子涂红,上一个房子涂什么颜色费用最少
            dp[i][1]=min(dp[i-1][0],dp[i-1][2])+costs[i][1];//当前房子涂蓝,上一个房子涂什么颜色费用最少
            dp[i][2]=min(dp[i-1][0],dp[i-1][1])+costs[i][2];//当前房子涂绿,上一个房子涂什么颜色费用最少
        }
        return min(dp[m-1][0],min(dp[m-1][1],dp[m-1][2]));
    }
};

15. 买卖股票的最佳时机含冷冻期(medium)

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/submissions/575503023/

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //一共有三种情况
        //股票交易当天结束后再计算
        //注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
        //冷冻期导致第二天不能买股票
        //当天结束指的是下一天的状态,当天还可以进行操作
        //当天结束后处于手上有股票(前一天手上有股票或者前一天手上没股票今天买入股票)
        //当天结束后处于冷冻期(前一天手上有股票且今天卖出)
        //当天结束后处于手上没股票且不是冷冻期(前一天处于冷冻期或前天手上没股票且不是冷冻期)
        int n=prices.size();
        vector<vector<int>>dp(n,vector<int>(3));
        dp[0][0]=-prices[0];
        for(int i=1;i<n;i++)
        {
            dp[i][0]=max(dp[i-1][0],dp[i-1][2]-prices[i]);
            dp[i][1]=dp[i-1][0]+prices[i];
            dp[i][2]=max(dp[i-1][1],dp[i-1][2]);
        }
        //最后返回的都是手上没股票的情况
        return max(dp[n-1][1],dp[n-1][2]);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值