动态规划(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