D - Array Without Local Maximums (dp)
阿新 • • 發佈:2018-12-03
題目連結
題意:
有一個長度為N的序列(2≤n≤1e5)滿足關係:
a1≤a2,an≤an−1,ai≤max(ai−1,ai+1)。
每一個ai的範圍是[1,200],有一些ai是確定的,有一些是不確定的,問有多少種情況。答案對998244353取模。
相當於說是對於任意三個相鄰的三個數a[i-1],a[i],a[i+1],只排出了a[i]>a[i-1],a[i]>a[i+1]這個情況,也就是一個山峰的樣子
dp[i][j][k],考慮第i個的時候放置j的時候與第i-1個關係是k(0,1,2-- < = >)的方案數
特殊的就是當k=2,也就是說當前這個小於i-1,那麼注意第i-1個不能是小於i-2個了(山峰)
字首和優化,否則超時
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod = 998244353; ll dp[100005][205][3],sum;///0< 1= 2> int a[100005], n, i, j; int main(){ cin>>n; for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=200;i++) dp[1][i][0] = (a[1] == -1 || a[1] == i) ? 1:0;///dp[i][j][k] ,number of (the i-th ,lay j ,cmp is k) for(i=2;i<=n;i++){ for(j=1;j<=200;j++)///left == [i] dp[i][j][1] = (a[i]==-1 || a[i]==j)?(dp[i-1][j][0]+dp[i-1][j][1]+dp[i-1][j][2])%mod:0; sum = 0; for(j=1;j<=200;j++){///left < [i] dp[i][j][0] = (a[i]==-1 || a[i]==j)?sum:0; sum = (sum+dp[i-1][j][0]+dp[i-1][j][1]+dp[i-1][j][2])%mod; } sum = 0; for(j=200;j;j--){///left > [i], dp[i][j][2] = (a[i]==-1 || a[i]==j)?sum:0; sum = (sum+dp[i-1][j][1]+dp[i-1][j][2])%mod; } } sum = 0; for(i=1;i<=200;i++) sum = (sum+dp[n][i][1]+dp[n][i][2])%mod; cout<<sum<<endl; return 0; }