只需要将时间和次数作为元素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; }