D. MEX Sequences
对于一个数x 要是前面出现过0,1,2...x-1 我们显然可以将他放在后面
要是前面出现过0 1 2 ... x-1 x 我们也可以将他放在后面
但是观察样例 还有一种情况就是
0 1 2 ... x-2 我们可以把 x 放在后面 但是之后我们只能放x-2 和 x 了
我们将这两种序列分为两类 状态表示就是dp[i][0/1]当前mex为i 并且是第一种情况 还是第二种情况
要是第一种情况 我们的转移是: dp[i][0]+=dp[i][0]+dp[i-1][0](我们之前的x-1和x后面都可以加这个
要是第二种情况 dp[i][1]+=dp[i][1] 这个是这种情况 0 1 2 ... i-2 i的这种情况我们只能放在i后面
当然要是i>=2 我们这个i也可以直接来放在i-2的后头 if(i>=2)dp[i][1]+=dp[i-2][0]
最后就是我们已经是 0 1 2 .... x x+2 这种情况来了个x 我们刚刚说是可以放的
dp[i+2][1]+=dp[i][1]
void solve(){
int n;cin>>n;
int dp[n+10][2];
memset(dp,0,sizeof dp);
dp[0][0]=1;
for(int i=1;i<=n;i++){
int x;cin>>x;x++;
(dp[x][0]+=dp[x][0]+dp[x-1][0])%=mod;
(dp[x][1]+=dp[x][1])%=mod;
(dp[x+2][1]+=dp[x+2][1])%=mod;
if(x>1)(dp[x][1]+=dp[x-2][0])%=mod;
}
int ans=0;
for(int i=1;i<=n+1;i++)(ans+=dp[i][0]+dp[i][1])%=mod;
cout<<ans<<endl;
}
标签:...,Educational,int,Codeforces,我们,情况,118,dp,mod
From: https://www.cnblogs.com/ycllz/p/16861454.html