Codeforces Round #627 (Div. 3) E - Sleeping Schedule(递推)
题意:
每天有 h 小时,有一序列 an,每次可以选择 ai 或 ai - 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; }