極大値のないアレイCF-1068D(计数DP)

トピック:

シーケンス$ a $を指定します。$ a [i] $ごとに、$ a [i] <= a [i-1] $または$ a [i] <= a [i + 1] $を満たす必要があります$ a [i] = -1 $の場合、ビットが不明であることを意味し、いくつのシーケンスが条件を満たすことができるかを尋ねます。

アイデア:

$ dp [i] [j] [k] $は、$ i $ビットが$ j $で満たされたときに、前のビットとの関係が$ k $であることを示します。

$ k = 0 $は$ a [i]> a [i-1] $を意味し、$ k = 1 $は$ a [i] = a [i-1] $を意味し、$ k = 2 $は$ a [i ] <a [i-1] $。転送タイプは次のとおりです。

$ dp [i] [j] [0] = \ sum_ {k = 1} ^ {j-1} {(dp [i-1] [k] [0] + dp [i-1] [k] [ 1] + dp [i-1] [k] [2])} $

$ dp [i] [j] [1] = dp [i-1] [j] [0] + dp [i-1] [j] [1] + dp [i-1] [j] [2]ドル

$ dp [i] [j] [2] = \ sum_ {k = j + 1} ^ {200} {(dp [i-1] [k] [1] + dp [i-1] [k] [ 2])} $

$ ans = \ sum_ {j = 1} ^ {200} {(dp [n] [j] [1] + dp [n] [j] [2])} $

コード:

1  // #include <bits / stdc ++。h> 
2 #include < set >
 3 #include <map>
 4 #include <stack>
 5 #include <cmath>
 6 #include <queue>
 7 #include <cstdio>
 8# include < string >
 9 #include <vector>
 10 #include <cstring>
 11 #include <iostream>
 12 #include <algorithm>
 13  
14  #define ll long long
 15  #define pll pair <ll、ll>
 16  #define pii pair <
int、int> 17 #define bug printf( "********* \ n")
 18  #define FIN freopen( "input.txt"、 "r"、stdin);
19  #define FON freopen( "output.txt"、 "w +"、stdout);
20  #define IO ios :: sync_with_stdio(false)、cin.tie(0)
 21  #define ls root << 1
 22  #define rs root << 1 | 1
 23  #define pb push_back
 24  
25  using  namespace std;
26  const  int inf = 2e9 + 7 ;
27  const ll Inf = 1e18 + 7 ;
28  const  intmaxn = 1e5 + 5 ;
29  const ll mod = 998244353 ;
30  
31 ll dp [maxn] [ 201 ] [ 3 ];
32  int a [maxn];
33  
34  int main()
 35  {
 36      int n;
37      scanf(" %d "、&n);
38      forint i = 1 ; i <= n; ++ i)scanf(" %d "、&​​a [i]);
39      if(a [ 1] == - 1 ){
 40          のためにINTは iは= 1 ; I <= 200 ; ++ I)DP [ 1 ] [i]が[ 0 ] = 1 ;
41      }
 42      else {
 43          dp [ 1 ] [a [ 1 ]] [ 0 ] = 1 ;
44      }
 45      forint i = 2 ; i <= n; ++ i)
 46      {
 47          ll tmp = 0 ; // 
48          forint j = 1 ; j <= 200 ; ++ j){
 49              if(a [i] ==- 1 || a [i] == j)dp [i] [j] [ 0 ] = tmp;
50              else dp [i] [j] [ 0 ] = 0 ;
51              tmp + = dp [i- 1 ] [j] [ 0 ] + dp [i- 1 ] [j] [ 1 ] + dp [i- 1 ] [j] [ 2 ];
52              tmp%= mod;
53          }
 54          // 等于
55         forint j = 1 ; j <= 200 ; ++ j){
 56              if(a [i] ==- 1 || a [i] == j)
 57                  dp [i] [j] [ 1 ] = (dp [i- 1 ] [j] [ 0 ] + dp [i- 1 ] [j] [ 1 ] + dp [i- 1 ] [j] [ 2 ])%mod;
58              else dp [i] [j] [ 1 ] = 0 ;
59          }
 60          tmp = 0 ; // 小于
61          についてint j = 200 ; j> = 1 ; -j){
 62              if(a [i] ==- 1 || a [i] == j)dp [i] [j] [ 2 ] = tmp;
63              else dp [i] [j] [ 2 ] = 0 ;
64              tmp + = dp [i- 1 ] [j] [ 1 ] + dp [i- 1 ] [j] [ 2 ];
65              tmp%= mod;
66          }
 67      }
 68      ll ans = 0 ;
69      のためにint i = 1 ; i <= 200 ; ++ i){
 70          if(a [n] ==- 1 || a [n] == i){
 71              ans + = dp [n] [i] [ 1 ] + dp [n] [i] [ 2 ];
72              ans%= mod;
73          }
 74      }
 75      printf(" %lld \ n " 、ans);
76 }

 

おすすめ

転載: www.cnblogs.com/zhang-Kelly/p/12719138.html