AtCoder Regular Contest 059 F Unhappy Hacking

Description


题面

Solution

我们发现如果一个位置需要被退掉,那么是 \(0\)\(1\) 都没有关系
于是我们想到把 \(0,1\) 归为一类
问题转化为每一次可以添加和删除一个 \(?\),求 \(n\) 次操作后最后长度变为 \(|S|\) 的方案数
我们最后可以把 \(?\) 对应成 \(S\),只需要把方案数除以一个 \(2^{|S|}\) 就行了

#include<bits/stdc++.h>
using namespace std;
const int N=5005,mod=1e9+7;
int n,f[N][N],m;char s[N];
int main(){
  freopen("pp.in","r",stdin);
  freopen("pp.out","w",stdout);
  scanf("%d%s",&n,s+1);m=strlen(s+1);
  f[0][0]=1;
  for(int i=0;i<n;i++)
	  for(int j=0;j<=i;j++){
		  if(j)f[i+1][j-1]=(f[i+1][j-1]+f[i][j])%mod;
		  else f[i+1][j]=(f[i+1][j]+f[i][j])%mod;
		  f[i+1][j+1]=(f[i+1][j+1]+1ll*f[i][j]*2)%mod;
	  }
  for(int i=1;i<=m;i++)f[n][m]=1ll*f[n][m]*500000004%mod;
  printf("%d\n",f[n][m]);
  return 0;
}

posted @ 2018-07-15 10:55  PIPIBoss  阅读(298)  评论(0编辑  收藏  举报