「火」皇家烈焰

「火」皇家烈焰

https://ac.nowcoder.com/acm/problem/53683

前面的碎碎念,每次每日一题看完题目感觉没思路就忍不住去瞄雨巨的题解,看完就感觉啥都会了,老这样是不是没提高啊

思路

dp[ i ][ 0 ][ 0 ]第i个位置 火,第i+1个位置
dp[ i ][ 0 ][ 1 ]第i个位置 火,第i+1个位置
dp[ i ][ 1 ][ 0 ]第i个位置 火,第i+1个位置
dp[ i ][ 1 ][ 1 ]第i个位置 火,第i+1个位置
这样就很容易可以写出状态转移方程了,都在代码里我就不在这写了

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
const int mod = 1e9+7;
const int maxn = 1000005;

ll dp[maxn][3][3];

int main(){
    string s;
    cin>>s;
    s = " " + s;
    dp[0][0][0] = dp[0][0][1] = 1;
    for(int i = 1 ; i < s.size() ; ++i){
        if(s[i]=='0'){
            dp[i][0][0] = dp[i-1][0][0];//左右均没有火,那i-1,i,i+1都是0
        }
        else if(s[i] == '1'){// 0 0 1或 1 0 1,其他为0
            dp[i][0][0] = dp[i-1][1][0];
            dp[i][0][1] = dp[i-1][0][0];
        }
        else if(s[i] == '2'){
            dp[i][0][1] = dp[i-1][1][0];
        }
        else if(s[i] == '*'){
            dp[i][1][0] = (dp[i-1][0][1]+dp[i-1][1][1])%mod;
            dp[i][1][1] = dp[i][1][0];//右边有火无火的情况都一样
        }
        else{
            dp[i][0][0] = (dp[i-1][1][0]+dp[i-1][0][0])%mod;//?情况满足当前位置情况就好
            dp[i][0][1] = dp[i][0][0];
            dp[i][1][0] = (dp[i-1][0][1]+dp[i-1][1][1])%mod;
            dp[i][1][1] = dp[i][1][0];
        }
    }
        cout<<(dp[s.size()-1][1][0]+dp[s.size()-1][0][0])%mod<<endl;//s.size()位置不可能是有火的
}

写这个题解主要是吐槽一下

鸽子的每日一题 文章被收录于专栏

牛客每日一题题解(不一定都会写

全部评论
看到一个题一般是需要先独立思考一定时间(根据个人情况,一般最少半个小时),实在想不出来再去看题解,看完题解你需要考虑自己的不正确的思路和题解差在了哪里,找到那个卡住你的点。 然后看完题解才做出来的题一两个月之后是需要回看的,否则你很有可能还是不会。
点赞 回复 分享
发布于 2020-05-08 10:40

相关推荐

AAA专业长城贴瓷砖刘大爷:这样的简历我会直接丢进垃圾桶,花里胡哨的
点赞 评论 收藏
分享
Rena1ssance_:对的,要是面评没太烂,勤更新简历等捞就行了,腾讯可以无限复活
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务