CF1093F

 

 

#include<bits/stdc++.h>

using namespace std;
const int N=1e5+20;
const int mod=998244353;

int a[N];
int n;
int k,len;
int dp[N][118];
//设dp[i][j]为考虑前i个位置,第i个位置填j的方案数
//非-1的状态不能改变,置0 
//这样的话dp[i][]就都是由s[i-1]转移过来的 
int s[N],l[N];
//s_i表示和,sigma   j~k的dp[i][j] 
//l填往前 相同的 最长长度 

int main()
{
    ios::sync_with_stdio(false);
    cin>>n;    
    cin>>k>>len;
        
    for(int i=1;i<=n;i++)
    cin>>a[i];
     //当l小于len的时候由si-1直接转移
    s[0]=1;
    //初始的话只能是1
    for(int i=1;i<=n;i++)
    {
        if(a[i]==-1)
        {
            //当前位置什么都能填 
            for(int j=1;j<=k;j++)
            l[j]++;
        }
        else
        {
            for(int j=1;j<=k;j++)
            {//当前位置本数可以叠一个长度 
                if(a[i]==j)
                l[j]++;
                else
                l[j]=0;
            //其他数字叠的长度归0    
            }
        }
        if(a[i]>=0)
        {
            int f=a[i];
            if(l[f]<len)
            dp[i][f]=s[i-1];
            else
            dp[i][f]=((s[i-1]-s[i-len]+mod)%mod+dp[i-len][f])%mod;
            
            s[i]=dp[i][f];
        }
        else
        {
            for(int j=1;j<=k;j++)
            {
                if(l[j]<len)
                dp[i][j]=s[i-1];
                else
                dp[i][j]=((s[i-1]-s[i-len]+mod)%mod+dp[i-len][j])%mod;
                
                s[i]=(s[i]+dp[i][j])%mod;
            }            
            
        }

    }
    
    cout<<s[n];
    return 0;
}

 

posted @ 2021-10-05 20:31  Hehe_0  阅读(40)  评论(0)    收藏  举报