动态规划--基础例题解析

    动态规划(Dynamic Programming,DP)是比较常见的算法题,一般除了比较困哪的题目,只要将题目中描述的状态找到,就能很快的列出对应的状态转移方程。我也搜索过很多状态转移的相关资料,但是还是太菜,看不懂,但是我比较喜欢在做题的时候进行总结。现在来看一下比较简单的DP题目。

原题连接:2020.3 腾讯后台笔试题
在这里插入图片描述    一般的动态规划都是使用一个一维或者二维的数组进行辅助计算,更简单点的就是只记录计算需要的那几天状态即可。题目很清楚的给出了一个人每天的状态:锻炼、工作、休息。那么我们就可以用三个变量:cur_exer ,cur_work ,cur_relax 表示在这种状态下最多的不休息天数(题目要求最至少休息几天,我习惯求最多,用全部天数减去最多不休息天数即可得到至少休息几天)。
    动态规划是需要一个初始值进行后面状态的计算的,并且今天的状态需要根据昨天的状态转化得来。因此,我们还需要定义三个昨天的状态变量:last_exer ,last_work ,last_relax
  那么如何进行状态转移呢?题目中设定的条件是:公司营业并且昨天没有工作,今天才能工作;健身房开门且昨天没有锻炼,今天才能锻炼;想休息就休息。所以可以对这三种类型写一个状态转移公式。
1、今天锻炼

  • 昨天休息,且今天健身房开业
  • 昨天工作,且今天健身房开业
    取这两种状态中不休息天数最多的。
		if (exer[i]==1){
   
            cur_exer = Math.max(last_work+1,last_relax+1);
        }

2、今天工作

  • 昨天休息,且今天公司开业
  • 昨天锻炼,且今天公司开业
    取这两种状态中不休息天数最多的。
		//work[i]==1 代表今天可以工作
		if (work[i]==1){
   
            cur_work 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值