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;
}
全部评论

相关推荐

11-14 16:13
已编辑
重庆科技大学 测试工程师
Amazarashi66:不进帖子我都知道🐮❤️网什么含金量
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务