题目链接:Problem - 1324E - Codeforces Sleeping Schedule
题目给定四个参数,n,h,l,r,其中n表示睡觉的次数,数组a[n]大小为n,a[i]表示下一次睡觉要经过a[i]或者a[i]-1个小时,h表示一天 有多少个小时,[l,r]这个区间表示在这个区间睡觉代表睡得好,每次睡觉睡完整的一天,求最大的睡的好的天数。数据量不大,考虑dp,dp[i][j]表示第i天j时刻睡觉的最大睡得好的天数。
#include<bits/stdc++.h> using namespace std; int n,h,l,r,a[2005],f[2005][2005]; int main(){ scanf("%d%d%d%d",&n,&h,&l,&r); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<h;i++){ f[0][i]=-1e9;//初始化 } f[0][0]=0;//初始化边界 for(int i=1;i<=n;i++){ for(int j=0;j<h;j++){ int x=(j-a[i]+h)%h;//由过a[i]小时睡觉转移 int y=(j-a[i]+1+h)%h;//由过a[i]-1小时睡觉转移 f[i][j]=max(f[i-1][x],f[i-1][y]); if(j<=r&&j>=l) f[i][j]++; } } int ans=0; for(int i=0;i<h;i++){ ans=max(ans,f[n][i]); } printf("%d\n",ans); return 0; }