http://codeforces.com/problemset/problem/404/D
扫雷 给一串字符串 ?表示未知 1表示周边有一个(左或右) 2表示周边有二个 *表示此位置为雷 求有几种放置方法 答案%1000000007
递推
len = 字符串最后下标
a[i].z表示 i位置放0的方案
a[i].of i位置放1 并左边放一个雷的方案数
a[i].or i位置放1 并右边放一个雷的方案数
a[i].t i位置放2 的方案数
a[i].m i位置放雷 的方案数
那么
a[i].z=a[i-1].of+a[i-1].z
a[i].of=a[i-1].m;
a[i].or=a[i-1].of+a[i-1].z
a[i].t=a[i-1].m
a[i].m=a[i-1].m+a[i-1].t+a[i-1].or
ans=a[len].of+a[len].m+a[len].z
记得过程中模1000000007
用GNU C++4.7提交老是编译错误 干脆换GNU C 4提交了
题目挺容易的 可以没来得及写到第四题....
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MOD 1000000007
struct xx
{
int z,of,or,t,m;
}a[2];
char str[1000005];
int main()
{
int i;
int l,n;
int len;
int ans;
scanf("%s",str);
len=strlen(str);
l=0;
if(str[0]=='?')
a[0].m=a[0].or=a[0].z=1;
else if(str[0]=='*')
a[0].m=1;
else if(str[0]=='0')
a[0].z=1;
else if(str[0]=='1')
a[0].or=1;
for(i=1;i<len;i++)
{
n=l^1;
if(str[i]=='?')
{
a[n].m=((a[l].m+a[l].t)%MOD+a[l].or)%MOD;
a[n].of=a[l].m;
a[n].or=(a[l].of+a[l].z)%MOD;
a[n].t=a[l].m;
a[n].z=(a[l].of+a[l].z)%MOD;
}
else if(str[i]=='0')
{
memset(&a[n],0,sizeof(a[n]));
a[n].z=(a[l].of+a[l].z)%MOD;
}
else if(str[i]=='1')
{
memset(&a[n],0,sizeof(a[n]));
a[n].of=a[l].m;
a[n].or=(a[l].of+a[l].z)%MOD;
}
else if(str[i]=='2')
{
memset(&a[n],0,sizeof(a[n]));
a[n].t=a[l].m;
}
else
{
memset(&a[n],0,sizeof(a[n]));
a[n].m=((a[l].m+a[l].or)%MOD+a[l].t)%MOD;
}
l=n;
}
ans=0;
ans=(ans+a[l].m)%MOD;
ans=(ans+a[l].of)%MOD;
ans=(ans+a[l].z)%MOD;
printf("%d\n",ans);
// system("pause");
return 0;
}