【非原创】codeforces - 1067A Array Without Local Maximums【dp】

学习博客:戳这里

附本人代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 1e5 + 10;
 5 const ll mod = 998244353;
 6 set<int>nu[maxn], rol[2];
 7 int a[maxn];
 8 ll dp[maxn][222][3];
 9 int main() {
10     int n;
11     scanf("%d", &n);
12     for(int i = 1; i <= n; ++i) {
13         scanf("%lld", a+i);
14     }
15     //处理边界
16     if(a[1] == -1) {
17         for(int i = 1; i <= 200; ++i) {
18                 dp[1][i][0] = 1ll;
19         }
20     } else {
21             dp[1][a[1]][0] = 1ll;
22     }
23     for(int i = 2; i <= n; ++i) {
24         ll sum = 0;
25         int len = 200;
26         if(a[i] != -1) len = a[i];
27         for(int j = 1; j <= len; ++j) { // >
28             if(a[i] == -1 || j == a[i])
29             dp[i][j][0] = (dp[i][j][0] + sum) % mod;
30             for(int k = 0; k < 3; ++k) {
31                 sum = (sum + dp[i - 1][j][k]) % mod;
32             }
33         }
34         for(int j = 1; j <= len; ++j) { // ==
35                 for(int k = 0; k < 3; ++k) {
36                     if(a[i] == -1 || j == a[i])
37                     dp[i][j][1] = (dp[i][j][1] + dp[i - 1][j][k]) % mod;
38                 }
39         }
40         if(i == 2) continue;
41         len = 1;
42         if(a[i] != -1) len = a[i];
43         sum = 0;
44         for(int j = 200; j >= len; --j) { // <
45             if(a[i] == -1 || j == a[i])
46             dp[i][j][2] =(dp[i][j][2] + sum) % mod;
47             for(int k = 1; k < 3; ++k) {
48                 sum = (sum + dp[i - 1][j][k]) % mod;
49             }
50         }
51     }
52     ll ans = 0;
53     for(int j = 1; j <= 200; ++j) {
54         for(int k = 1; k < 3; ++k) {
55             if(a[n] == -1 || j == a[n])
56             ans = (ans + dp[n][j][k]) % mod;
57         }
58     }
59     printf("%lld\n", ans);
60     return 0;
61 }
View Code

 

posted @ 2018-11-03 12:06  euzmin  阅读(401)  评论(0编辑  收藏  举报