我是靠谱客的博主 悦耳狗,最近开发中收集的这篇文章主要介绍Educational Codeforces Round 118 (Rated for Div. 2) D. MEX Sequences(计数dp,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
已知插入的x会存在两种情况
- 0 0 1 1 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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复