CF1324E(動的計画)

睡眠スケジュール

アイデア:睡眠時間と次の睡眠時間の関係は伝達関係であるため、各層の情報を記録する必要があります。時刻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、-1sizeof (dp));
23      // cout << dp [0] [0] << endl; 
24      dp [ 0 ] [ 0 ] = 0 ;
25      forint i = 1 ; i <= n; ++ i){
 26          cin >> ai;
27          forint 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 }

 

おすすめ

転載: www.cnblogs.com/SSummerZzz/p/12705980.html