题意
Vova有一个睡眠时间表,一天有h小时,Vova会睡n次觉,一次睡一天,在第i−1次睡醒后,Vova在ai或ai−1个小时候可以再次入睡,一开始时间为第0时(可以视作Vova刚醒),Vova在[l,r]区间时睡觉会睡得舒服,问Vova最多可以睡几次舒服觉
分析
发现第i次睡眠的时间是由第i−1次睡眠时间决定的,一个显然的转移,因此这道题采用DP
首先我们可以设第0次睡眠时,Vova是在第0时刻睡的
假设Vova在第i−1次睡眠时在第j时刻,那么第i次Vova可以在第(j+ai)%h时刻或者在第(j+ai−1)%h时刻睡觉,我们可以记录一个vis[i][j]表示Vova在第i次睡眠时在第j时刻可以睡
而如果(j+ai)%h在[l,r]区间内,则第i次睡眠在第(j+ai)%h时刻的答案数为第i−1次睡眠时j时刻的答案数加一,因为有多种方案使得Vova能在第i−1次睡眠时在第j时刻,因此取最大值,可以记录dp[i][j]表示在第i次睡眠时在第j时刻的答案,dp[i][(j+ai)%h]=max(dp[i−1][j]+1,dp[i][(j+ai)%h])
如果(j+ai)%h不在[l,r]区间内,则dp[i][(j+ai)%h]=max(dp[i−1][j],dp[i][(j+ai)%h])
答案可以在每次更新dp[i][j]时更新
(j+ai−1)%h同理
这题不卡空间,可以不使用滚动数组
1 |
|