每天有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]; void solve(){ 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; } int main() { solve(); return 0; }
Codeforces Round #627 (Div. 3) E - Sleeping Schedule(动态规划)
原文:https://www.cnblogs.com/Kanoon/p/12485734.html