E

只需要将时间和次数作为元素DP就行


#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<map>
#include<queue>
#include<vector>
#define ll long long
#define F first
#define S second
#define debug(x); printf("debug%d
",x);
#define rep(f,t) for(int i=f;i<=t;i++)
const int inf=0x3f3f3f3f;
const int N=2e3+5;
int dp[N][N];
int n,h,l,r;
int a[N];
using namespace std;
int main()
{
    scanf("%d%d%d%d",&n,&h,&l,&r);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    memset(dp,-1,sizeof dp);//取值为负数的原因是有很多状态是无法达到的,只能由初状态得来。
    dp[0][0]=0;
    int t=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<h;j++)
        {
            if(dp[i-1][j]>=0)
            {
                t=(j+a[i])%h;
                dp[i][t]=max(dp[i][t],dp[i-1][j]+(l<=t&&t<=r));
                //debug(dp[i][t]);
                t=(j+a[i]-1+h)%h;
                dp[i][t]=max(dp[i][t],dp[i-1][j]+(l<=t&&t<=r));
                //debug(dp[i][t]);
            }
        }
    }
    int ans=0;
    for(int i=0;i<h;i++)
    {
        ans=max(ans,dp[n][i]);
    }
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/switch-waht/p/12485300.html