アイデア:睡眠時間と次の睡眠時間の関係は伝達関係であるため、各層の情報を記録する必要があります。時刻hは情報を圧縮でき、dp [i] [j]はi番目の睡眠段階で表すことができます時間jにおける「ぐっすり睡眠」の数。
dp [i-1] [j]が正当な状況である場合、つまり、プロセスが状態遷移中に発生した場合、遷移には2つのケースがあります。
dp [i] [(j + ai)%h] = max(dp [i] [(j + ai)%h]、dp [i-1] [j] + is_good_sleep?);
dp [i] [(j + ai-1)%h] = max(dp [i] [(j + ai-1)%h]、dp [i-1] [j] + is_good_sleep?);
1 #include <iostream> 2 #include <deque> 3 #include <algorithm> 4 #include <stack> 5 #include <vector> 6 #include <cstring> 7 8 名前空間std を使用 ; 9 10 const int N = 2e3 + 10 ; 11 int dp [N] [N]; 12 int n、h、l、r; 13 14インラインint add(int x){ 15 return x> = l && x <= r; 16 } 17 18 void solve(){ 19 20 cin >> n >> h >> l >> r; 21 int ai; 22 memset(dp、-1、sizeof (dp)); 23 // cout << dp [0] [0] << endl; 24 dp [ 0 ] [ 0 ] = 0 ; 25 for(int i = 1 ; i <= n; ++ i){ 26 cin >> ai; 27 for(int j = 0 ; j <h; ++ j){ 28 if(dp [i- 1 ] [j]!=- 1 ){ 29 dp [i] [(j + ai)%h] = 30 max(dp [i] [(j + ai)%h]、dp [ i- 1 ] [j] + add((j + ai)%h)); 31 32 dp [i] [(j + ai- 1)%h] = 33 max(dp [i] [(j + ai- 1)%h]、dp [i- 1 ] [j] + add(( j + ai- 1)%h)); 34 } 35 } 36 } 37 int Max_tot = -1 ; 38 のための(int i = 0 ; i <h; ++ i){ 39 Max_tot = max(Max_tot、dp [n] [i]); 40 } 41 cout << Max_tot << endl; 42 } 43 44 int main(){ 45 46 ios :: sync_with_stdio(false ); 47 cin.tie(0 ); 48 cout.tie(0 ); その49 (Page) 50 51 return 0 ; 52 }