NC53683 「火」皇家烈焰
「火」皇家烈焰
http://www.nowcoder.com/questionTerminal/64d45564c38d40f5a46b6ba0313e58df
题目:
帕秋莉掌握了一种火属性魔法
由于钟爱扫雷游戏,帕秋莉把自己图书馆前的走廊看作一个一维的扫雷地图,她制造了很多烈焰,排在这条走廊内
现在帕秋莉告诉你一部分烈焰的分布情况,请你告诉她可能的情况有多少种
对于一个格子,里面会有以下几种字符:
0:这个格子没有烈焰,且其左右两个格子均没有烈焰
1:这个格子没有烈焰,且其左右两个格子中只有一个烈焰
2:这个格子没有烈焰,且其左右两个格子中均有烈焰
*:这个格子有烈焰
?:未告诉你本格情况
思路:动态规划,状态受前一个、当前、后一个影响,故用三维数组f[i][0/1][0/1],i表示前i个,第二维表示当前位置是否有烈焰,第三维表示后一位是否有烈焰。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define ll long long
const ll mod=1e9+7;
ll f[1000005][2][2];
char str[1000005];
int main()
{
scanf("%s",str+1);
str[0]='@';
int len=strlen(str)-1;
f[0][0][0]=f[0][0][1]=1;
for(int i=1;i<=len;i++)
{
if(str[i]=='0')
{
f[i][0][0]=f[i-1][0][0];
}
else if(str[i]=='1')
{
f[i][0][0]=f[i-1][1][0];
f[i][0][1]=f[i-1][0][0];
}
else if(str[i]=='2')
{
f[i][0][1]=f[i-1][1][0];
}
else if(str[i]=='*')
{
f[i][1][0]=f[i][1][1]=(f[i-1][0][1]+f[i-1][1][1])%mod;
}
else if(str[i]=='?')
{
f[i][0][0]=f[i][0][1]=(f[i-1][0][0]+f[i-1][1][0])%mod;
f[i][1][0]=f[i][1][1]=(f[i-1][0][1]+f[i-1][1][1])%mod;
}
}
cout << (f[len][0][0]+f[len][1][0])%mod;
return 0;
}
