我是靠谱客的博主 悦耳狗,最近开发中收集的这篇文章主要介绍Educational Codeforces Round 118 (Rated for Div. 2) D. MEX Sequences(计数dp,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

已知插入的x会存在两种情况

  1. 0 0 1 1 2 2
  2. 0 0 1 3 3

考虑dp,dp[n][2],dp[x][0]表示第一种情况,dp[x][1]表示第二种情况
dp[x]表示当前插入的为x并且以x结尾
首先考虑第一种情况:
1.考虑与dp[x-1][0]组合
2.考虑与dp[x][0]组合(pre)
考虑第二种情况
1.考虑与dp[x-1][1]组合
2.考虑与dp[x][1]组合(pre)
额外考虑的是 须计算对dp[x+2][1]的贡献 即*2

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;
#define int long long
const int mod=998244353;
const int N=5e5+10;
int t,n,a[N];
int dp[N][2];
void solve(){
    scanf("%lld",&n);
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        int x;scanf("%lld",&x);x++;
        dp[x][0]=(dp[x][0]*(int)2)%mod;
        dp[x][0]=(dp[x][0]+dp[x-1][0])%mod;
//        dp[x][0]=(dp[x][0]+dp[x-1][0])%mod;
        if(x>=2) dp[x][1]=(dp[x][1]*(int)2%mod+dp[x-2][0])%mod;
        if(x<=n-2) dp[x+2][1]=(dp[x+2][1]*2)%mod;
    }
//    cout<<dp[1][0]<<endl;
    long long sum=0;
    for(int i=1;i<=n+1;i++){
        sum+=(dp[i][0]+dp[i][1])%mod;
        sum%=mod;
        dp[i][0]=dp[i][1]=0;
    }
    cout<<sum<<endl;
}
int32_t main(){
    scanf("%lld",&t);
    while(t--){
        solve();
    }
}

最后

以上就是悦耳狗为你收集整理的Educational Codeforces Round 118 (Rated for Div. 2) D. MEX Sequences(计数dp的全部内容,希望文章能够帮你解决Educational Codeforces Round 118 (Rated for Div. 2) D. MEX Sequences(计数dp所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部