动态规划<三>多状态dp问题

目录

1.第一题

打家劫舍问题

 1.第二题

 2.第三题

3.第四题

5.第五题

买股票问题

1.第六题

 2.第七题

 3.第八题

4.第九题 


1.第一题

LeetCode<面试题17.16> 按摩师

画图分析:

使用动态规划解决问题

1.确定状态表示   根据经验+题目要求

dp[i]表示:选择到i位置时,最长的预约时长

但这里其实还可以再划分这个状态表示,选择到i位置时,对于i位置有选与不选两种情况

f[i]:表示选择到i位置时,i位置值(nums[i])必选,最长的预约时长

g[i]:表示选择到i位置时,nums[i]不选,最长的预约时长

2.状态转移方程

3.初始化

根据状态转移方程,发生越界的是f[0],g[0]

根据状态表示,f[0]表示选择到0位置,且nums[0]必选的最长时长  f[0]=nums[0]

同理,g[0]=0

4.填表顺序    从左往右两个表一起填

5.返回值

对于最后一个位置(n-1)有选与不选两种情况,即返回max(f[n-1],g[n-1])

具体代码

int massage(vector<int>& nums) 
    {
        int n=nums.size();
        if(n==0) return 0;//处理边界

        vector<int> f(n),g(n);
        f[0]=nums[0];
        for(int i=1;i<n;++i)
        {
            f[i]=g[i-1]+nums[i];
            g[i]=max(f[i-1],g[i-1]);
        }

        return max(f[n-1],g[n-1]);
    }

打家劫舍问题

 1.第二题

OJ传送门 LeetCode<198> 打家劫舍

画图分析

 使用动态规划来解决

1.确定状态表示

dp[i]:表示当偷到i位置的房屋时,此时的偷到的最高金额

但同样的对于i位置的处理,可以有偷与不偷两种情况

f[i]:表示偷到i位置时,偷i位置(nums[i]),此时的最高金额

g[i]:表示偷到i位置时,不偷nums[i],此时的最高金额

2.状态转移方程

3.初始化

根据状态表示,f[0]=nums[0],g[0]=0

4.填表顺序  从左往右两个表一起填

5.返回值   

对于最后一个位置(n-1)有选与不选两种情况,即返回max(f[n-1],g[n-1])

具体代码

int rob(vector<int>& nums) 
    {
        //1.创建dp表
        //2.初始化
        //3.填表
        //4.返回值
        int n=nums.size();
        vector<int> f(n),g(n);
        f[0]=nums[0];
        for(int i=1;i<n;++i)
        {
            f[i]=g[i-1]+nums[i];
            g[i]=max(f[i-1],g[i-1]);
        }
        return max(f[n-1],g[n-1]);
    }

 2.第三题

OJ传送门 LeetCode<213> 打家劫舍II

画图分析

&n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值