ABC189 D - Logical Expression(dp)

题意:

在这里插入图片描述

解法:

d[i][j]表示前i步,y为j的方案数,
初始条件为d[0][0]=d[0][1]=1,
然后枚举下一步x的选择进行dp的转移(方案数统计)即可,

code:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=3e5+5;
int d[maxm][2];//d[i][j]表示前i步,y为j的方案数
int f[maxm];
int n;
void solve(){
    
    
    cin>>n;
    for(int i=1;i<=n;i++){
    
    
        string s;cin>>s;
        if(s[0]=='A'){
    
    //&
            f[i]=1;
        }else if(s[0]=='O'){
    
    //|
            f[i]=2;
        }
    }
    d[0][0]=d[0][1]=1;
    for(int i=1;i<=n;i++){
    
    
        if(f[i]==1){
    
    //&
            //x[i]=0
                d[i][0]+=d[i-1][0];
                d[i][0]+=d[i-1][1];
            //x[i]=1
                d[i][0]+=d[i-1][0];
                d[i][1]+=d[i-1][1];
        }else if(f[i]==2){
    
    //|
            //x[i]=0
                d[i][0]+=d[i-1][0];
                d[i][1]+=d[i-1][1];
            //x[i]=1
                d[i][1]+=d[i-1][0];
                d[i][1]+=d[i-1][1];
        }
    }
    cout<<d[n][1]<<endl;
}
signed main(){
    
    
    ios::sync_with_stdio(0);
    solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/113096915