Codeforces Round #627 (Div. 3) E - Sleeping Schedule(递推)

题意:

每天有 h 小时,有一序列 an,每次可以选择 a或 a- 1 小时后睡觉,问从 0 次 0 时开始,最多在 l ~ r 时间段入睡多少次。

思路:

如果此时可达,计算此时可达的时间点及其是否位于 l ~ r 区间。

#include <bits/stdc++.h>
using namespace std;

const int M=2200;
int dp[M][M];

int main()
{
    int n,h,l,r;cin>>n>>h>>l>>r;
    int a[n];for(int i=0;i<n;i++) cin>>a[i];

    fill(*dp,*dp+M*M,-1);
    
    dp[0][0]=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<h;j++){
            if(dp[i][j]!=-1){
                int k=(j+a[i])%h;
                dp[i+1][k]=max(dp[i+1][k],dp[i][j]+(k>=l&&k<=r));
                k=(j+a[i]-1)%h;
                dp[i+1][k]=max(dp[i+1][k],dp[i][j]+(k>=l&&k<=r));
            }
        }
    }

    int ans=0;
    for(int i=0;i<h;i++)
        ans=max(ans,dp[n][i]);
    cout<<ans<<endl;

    return 0;
}

 

posted @ 2020-03-13 12:36  Kanoon  阅读(120)  评论(0编辑  收藏  举报