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