牛客OI周赛13-提高组-0还是1-(dp+位运算)

https://ac.nowcoder.com/acm/contest/2970/A

给出长度为n的一连串位运算符号,用n+1个0或1使运算插入最后得到1,求01序列有多少种可能。

dp[i][j]表示进行第j个运算符后得到i的种数,i=0或1;

很容易得到各种运算符的dp递推式

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner scan=new Scanner(System.in);
        int n;
        long p=1000000007;
        n=scan.nextInt();
        long [][] dp=new long [2][10000005];
        dp[0][0]=dp[1][0]=1;
        String s;
        s=scan.next();
        s="!"+s;
        for(int i=1;i<=n;i++)
        {
            char x=s.charAt(i);
            if(x=='&')
            {
                dp[0][i]=(dp[0][i-1]*2+dp[1][i-1])%p;
                dp[1][i]=dp[1][i-1];
            }
            if(x=='|')
            {
                dp[0][i]=dp[0][i-1];
                dp[1][i]=(dp[0][i-1]+dp[1][i-1]*2)%p;

            }
            if(x=='^')
            {
                dp[0][i]=(dp[0][i-1]+dp[1][i-1])%p;
                dp[1][i]=(dp[0][i-1]+dp[1][i-1])%p;
            }
        }
        System.out.println(dp[1][n]);
    }
}
原文地址:https://www.cnblogs.com/shoulinniao/p/12004148.html