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]); } }