链接:
「火」皇家烈焰

文章目录

  • 题目描述
  • 题解:
  • 代码:
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

帕秋莉掌握了一种火属性魔法

由于钟爱扫雷游戏,帕秋莉把自己图书馆前的走廊看作一个一维的扫雷地图,她制造了很多烈焰,排在这条走廊内

现在帕秋莉告诉你一部分烈焰的分布情况,请你告诉她可能的情况有多少种

对于一个格子,里面会有以下几种字符:

0:这个格子没有烈焰,且其左右两个格子均没有烈焰

1:这个格子没有烈焰,且其左右两个格子中只有一个烈焰

2:这个格子没有烈焰,且其左右两个格子中均有烈焰

*:这个格子有烈焰

?:未告诉你本格情况

输入描述:

一个字符串

输出描述:

输出一行,一个整数表示答案,对1e9+7取模

示例1
输入

?1?

输出

2

说明
已知第二个格子左右有一个烈焰

因此可能的情况有10和01,显然其他情况都无法满足已知条件的要求
备注:
字符串的长度为n
对于30%的数据,n≤20
对于60%的的数据,n≤1,000
对于100%的数据,n≤1,000,000

题解:

乍一看以为是扫雷。仔细一看为什么又是dp(每日一题好爱出dp,而我dp又是渣渣)

在其他大佬那吸取知识之后,写出自己的理解:

我们仔细看题可以看出,每个点什么情况其实都与两侧的点息息相关,我可以通过一个点算出两侧点的状态,也可以根据两侧状态来反推中间的点。
但是我们状态转移的顺序是从左到右,我们在转移过程中,考虑第i点时,i-1之前的点状态都是固定的,所以我们只需要考虑当前点i与之后一个点i+1的状态。
在第i点时,i+1可能也有了要求,所以不满足情况的就不用转移状态。
dp[i][0/1/2/3]:

0表示i与i+1都不是火
1表示i是火,i+1不是火
2表示i不是火,i+1是
3表示i和i+1都是火

对照题目给出的状态,

 0:这个格子没有烈焰,且其左右两个格子均没有烈焰1:这个格子没有烈焰,且其左右两个格子中只有一个烈焰2:这个格子没有烈焰,且其左右两个格子中均有烈焰*:这个格子有烈焰?:未告诉你本格情况

具体情况如下:

if(i = = 0)
说明i-1,i,i+1都没有火,i 的状态就是等同于i-1的状态都是0(即本身与右边都不是火)
转移方程:f [i ] [ 0 ] = f [ i - 1 ] [ 0 ]

if(i = = 1)
i不是火,但是i的周围有一个火
如果左边是火,那么右边就不是火,那i就满足状态0,i-1就满足状态1:f[i][0]=f[i-1][1]
如果右边是火,左边就不是火,那么i就满足状态2,i-1就满足状态0:f [ i ][ 2 ] = f [ i - 1 ] [ 0]

if(i = = 2)
左右均为火,那么i-1是火,i不是火,i+1是火,i就满足状态2: f [ i ] [ 2 ] =f [ i-1 ] [ 1 ]

if(i = = *)
当前i为火,I+1有两种情况,
一个是i+1位火:
f [ i ] [ 3 ]= f [ i - 1 ] [ 2 ] + f [ i - 1 ] [ 3 ]
i+1不是火:
f [ i ] [ 1 ] = f [ i - 1 ] [ 2 ] + f [ i - 1 ] [ 3 ]

if(i = = ?)
当前点未知,我们就要考虑所有情况
i为火,i不为火,i+1为火,i+1不为火
四种情况:
i与i+1都不是火:
f [ i ] [0 ] = f[ i - 1 ][ 0 ] + f [i - 1 ] [ 1 ]

i不是,i+1是火
f [ i ] [ 2 ] = f [ i - 1 ] [ 0 ] + f [ i - 1 ] [ 1 ]

i是火,i+1不是
f [ i ] [ 1 ] = f [ i - 1 ] [ 2 ] + f [i - 1 ] [ 3 ]

i和i+1都是火
f [ i ] [ 3 ] = f [ i - 1 ] [ 2 ] + f [ i - 1 ][ 3 ]

到最后一个点i,i后面没有点了,相当于i+1不是火
答案就是
i是火与不是火了两种情况加一起
f [ i ] [ 0 ] + f [ i ] [ 1 ]
此时i=地图长度

对了前往不要忘了取模mod

结合我讲的,在代码里面一条一条对应

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+1,mod=1e9+7;
int f[maxn][7];
char s[maxn];
int main()
{f[0][0]=f[0][2]=1; cin>>s;int len=strlen(s);for(int i=1;i<=len;++i){if(s[i-1]=='0'){f[i][0]=f[i-1][0];}else if(s[i-1]=='1'){f[i][0]=f[i-1][1];f[i][2]=f[i-1][0];}else if(s[i-1]=='2'){f[i][2]=f[i-1][1];}else if(s[i-1]=='*'){f[i][1]=(f[i-1][2]+f[i-1][3])%mod;f[i][3]=(f[i-1][2]+f[i-1][3])%mod;}else if(s[i-1]=='?'){f[i][0]=(f[i-1][0]+f[i-1][1])%mod;f[i][2]=(f[i-1][0]+f[i-1][1])%mod;f[i][1]=(f[i-1][2]+f[i-1][3])%mod;f[i][3]=(f[i-1][2]+f[i-1][3])%mod;}}cout<<(f[len][0]+f[len][1])%mod;return 0;
}

【每日一题】5月7日题目精讲 「火」皇家烈焰相关推荐

  1. 牛客网 每日一题 7月23日题目精讲—wpy的请求

    来源:牛客网: 文章目录 wpy的请求 题解: 代码: wpy的请求 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge ...

  2. 【每日一题】8月28日题目精讲 编号

    [每日一题]8月28日题目精讲 编号 链接:https://ac.nowcoder.com/acm/problem/19925 来源:牛客网 题目描述 你需要给一批商品编号,其中每个编号都是一个7位1 ...

  3. 【每日一题】7月17日题目精讲—BOWL 碗的叠放

    [每日一题]7月17日题目精讲-BOWL 碗的叠放 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld ...

  4. 【每日一题】7月15日题目精讲—生日快乐

    [每日一题]7月15日题目精讲-生日快乐 [SCOI2009]生日快乐 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO For ...

  5. 【每日一题】7月13日题目精讲—Kingdom

    [每日一题]7月13日题目精讲-Kingdom 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 1048576K,其他语言2097152K 64bi ...

  6. 【牛客每日一题】tokitsukaze and Soldier 题目精讲 贪心、优先队列、堆

    链接:https://ac.nowcoder.com/acm/problem/50439 来源:牛客网 ACM在线模板 今天才发现牛客推出了一个每日一题的版块,3月25号就开始了,今天才发现,赶紧补救 ...

  7. 牛客网【每日一题】4月14日题目精讲 Xorto

    文章目录 题目描述 题解: 代码: 扩展 传送 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format:%lld 题目描述 ...

  8. 【每日一题】7月1日题目精讲 借教室

    来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 文章目录 题目描述 题解: 差分: 二 ...

  9. 牛客网 【每日一题】6月11日题目精讲 背包

    链接: 文章目录 题目描述 题解: 代码: 题目描述 Applese有1个容量为v的背包,有n个物品,每一个物品有一个价值ai,以及一个大小bi 然后他对此提出了自己的疑问,如果我不要装的物品装的价值 ...

最新文章

  1. cookie和url参数获取的常规实用方法合集(ES6)
  2. python -os、sys
  3. 成功解决OpenVideoCall(不可用)以及MSB8020 The build tools for v141 (Platform Toolset = ‘v141‘) cannot be found
  4. Node,Document,HTMLDocument,HTMLCollection解析
  5. eclipse中如何将中文乱码的class文件改为可读
  6. Android中弹出对话框,AlertDialog关键代码
  7. 网页嵌入pdf、在线预览pdf工具及插件(转)
  8. 有向图生成树个数(bzoj 4894: 天赋)
  9. Java基础之字符串详细比较
  10. Java EE服务技术
  11. 大一上学期期末考试知识点回顾(3.16补充知识点:插入排序)
  12. 试验设计与matlab数据分析 下载,试验设计与MATLAB数据分析
  13. oppo鸿蒙系统刷机包下载,OPPO A59st官方固件rom刷机包_OPPO A59st系统升级包下载
  14. 解决MacBook无法读写移动硬盘的问题
  15. 路演商业计划书PPT模板
  16. 魔众视频管理系统 v3.2.0 系统自动升级,页面SEO优化
  17. 团队作业8----第二次项目冲刺(Beta阶段) 第三天
  18. httpclient发布application/octet-stream
  19. 【033】Bootstrap实现标签页效果
  20. 获取frame 标签里#documents里面的内容

热门文章

  1. 福利来袭,送你105例C语言实战
  2. java 抽象类与接口区别是什么_JAVA中抽象类与接口的区别,分别在什么情况下使用它们...
  3. 自动摘要php,修改DEDECMS文章自动摘要长度或者取掉文章摘要
  4. HTML阅读位置,script在HTML文档中位置
  5. cad必练10张图_CAD比例问题大详解!赶紧收藏!
  6. 华为交换机初始化_华为交换机恢复出厂设置
  7. python——学习笔记1
  8. python程序启动其他python程序,如何使用Python启动应用程序的实例?
  9. leetcode377. 组合总和 Ⅳ
  10. [蓝桥杯][算法提高VIP]聪明的美食家-dp