动态规划11:面试题 17.16. 按摩师

动态规划解题步骤:

1.确定状态表示:dp[i]是什么

2.确定状态转移方程:dp[i]等于什么

3.初始化:确保状态转移方程不越界

4.确定填表顺序:根据状态转移方程即可确定填表顺序

5.确定返回值

题目链接: 面试题 17.16. 按摩师 - 力扣(LeetCode)

题解1(斐波那契数列模型):

1.状态表示: dp[i]表示接受nums[i]预约的最优预约

2.状态转移方程:dp[i]=nums[i]+max(dp[i-2],dp[i-3]) 由于接受了nums[i]的预约,所以只能接受nums[i-2]或者nums[i-3]的预约

3.初始化:dp[0]=nums[0]、dp[1]=nums[1]、dp[2]=nums[0]+nums[2]

4.填表顺序:一维数组,从左向右填写

5.返回值:max(dp[n-1],dp[n-2]) 最优预约只能是接受最后一天或者倒数第二天预约

cpp 复制代码
class Solution {
public:
    int massage(vector<int>& nums) {
        size_t n=nums.size();
        //处理边界条件
        if(n==0)
            return 0;
        if(n==1)
            return nums[0];
        if(n==2)
            return max(nums[0],nums[1]);
        if(n==3)
            return max(nums[0]+nums[2],nums[1]);
        //dp[i]表示最后一个预约是nums[i]的最优预约
        //创建dp表
        vector<int> dp(n);
        //初始化
        dp[0]=nums[0];
        dp[1]=nums[1];
        dp[2]=nums[0]+nums[2];
        //填表
        for(int i=3;i<n;++i)
        {
            dp[i]=nums[i]+max(dp[i-2],dp[i-3]);
        }
        //返回值
        return max(dp[n-1],dp[n-2]);
    }
};

题解2(简单多状态dp问题):

1.状态表示:有两个dp表,分别为f[i]和g[i],分别表示接受nums[i]预约和不接受nums[i]预约的最优预约

2.状态转移方程:f[i]=nums[i]+g[i-1] g[i]=max(f[i-1],g[i-1]) 接受nums[i]的预约,最佳预约就是再加上不接受前一个预约的最佳预约;不接受nums[i]的预约,最佳预约就是取接受或者不接受前一个预约的最大值

3.初始化:f[0]=nums[0] g[0]=0

4.填表顺序:一维数组,从左向右填写

5.返回值:max(f[n-1],g[n-1])

cpp 复制代码
class Solution {
public:
    int massage(vector<int>& nums) {
        size_t n=nums.size();
        //处理边界条件
        if(n==0)
            return 0;
        //创建dp表
        vector<int> f(n);
        auto g=f;
        //初始化
        f[0]=nums[0];
        g[0]=0;
        //填表
        for(int i=1;i<n;++i)
        {
            f[i]=nums[i]+g[i-1];
            g[i]=max(f[i-1],g[i-1]);
        }
        return max(f[n-1],g[n-1]);
    }
};
相关推荐
Learner__Q2 天前
每天五分钟:动态规划-LeetCode高频题_day2
算法·leetcode·动态规划
李玮豪Jimmy2 天前
Day37:动态规划part10(300.最长递增子序列、674.最长连续递增序列 、718.最长重复子数组)
算法·动态规划
_OP_CHEN3 天前
【算法基础篇】(三十三)动态规划之区间 DP:从回文串到石子合并,吃透区间类问题的万能解法
c++·算法·蓝桥杯·动态规划·算法竞赛·acm/icpc·区间动态规划
roman_日积跬步-终至千里3 天前
【计算机设计与算法-习题2】动态规划应用:矩阵乘法与钢条切割问题
算法·矩阵·动态规划
少许极端3 天前
算法奇妙屋(十八)-子数组系列(动态规划)
算法·动态规划·子数组
_OP_CHEN3 天前
【算法基础篇】(三十二)动态规划之背包问题扩展:从多重到多维,解锁背包问题全场景
c++·算法·蓝桥杯·动态规划·背包问题·算法竞赛·acm/icpc
好易学·数据结构4 天前
可视化图解算法73:跳台阶(爬楼梯)
数据结构·算法·leetcode·动态规划·笔试
_OP_CHEN5 天前
【算法基础篇】(三十一)动态规划之基础背包问题:从 01背包到完全背包,带你吃透背包问题的核心逻辑
算法·蓝桥杯·动态规划·背包问题·01背包·完全背包·acm/icpc
啊吧怪不啊吧5 天前
算法王冠上的明珠——动态规划之路径问题(第一篇)
大数据·算法·贪心算法·动态规划
CoderYanger5 天前
动态规划算法-01背包问题:50.分割等和子集
java·算法·leetcode·动态规划·1024程序员节