DP专题练习8

结果为真的序列I

在这里插入图片描述

当前位置填的False或者true和当前结果1或者0两两组合一共四个状态,也可以可以写成一维的

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
#define inf 1e18
const int mod = 998244353;
const int N = 1e5 + 10;
int dp[N][2][2];
         //0、1表示当前这个位置填F or T 
            //0、1表示结果为F or T
int n;
string s;
void solve(){
    cin >> n >> s;
    s = " " + s;
    dp[0][1][1] = dp[0][0][0] = 1;
    for(int i = 1 ; i <= n ; i ++)
    {
        if(s[i] == '0'){
            //做&运算
            dp[i][0][0] = (dp[i-1][0][0] + dp[i-1][1][0] + dp[i-1][0][1] + dp[i-1][1][1])%mod;
            dp[i][0][1] = 0;
            dp[i][1][0] = (dp[i-1][0][0] + dp[i-1][1][0])%mod;
            dp[i][1][1] = (dp[i-1][0][1] + dp[i-1][1][1])%mod;
        } else{
            //做异或运算
            //1^1 = 0^0 = 0  1^0=1
            dp[i][0][0] = (dp[i-1][0][0] + dp[i-1][1][0]) % mod;
            dp[i][0][1] = (dp[i-1][0][1] + dp[i-1][1][1]) % mod;
            dp[i][1][0] = (dp[i-1][0][1] + dp[i-1][1][1]) % mod;
            dp[i][1][1] = (dp[i-1][0][0] + dp[i-1][1][0]) % mod; 
        }
    }
    cout << (dp[n][1][1] + dp[n][0][1])%mod;
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int _ = 1;
    //cin >> _;
    while(_--) solve();
    return 0;
}
posted @ 2024-04-09 23:55  xde_yt  阅读(2)  评论(0编辑  收藏  举报  来源