博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HDU5965]扫雷
阅读量:6086 次
发布时间:2019-06-20

本文共 1413 字,大约阅读时间需要 4 分钟。

[HDU5965]扫雷

题目大意:

一个\(3\times n(n\le10000)\)的扫雷,第\(2\)排没有雷。告诉你第\(2\)排上的数,问有几种埋雷的方案?

思路:

动态规划。

\(1,3\)两排的雷全部往左移一格,即第\(2\)排上第\(i\)列的数只和\(1,3\)两排第\(i-2,i-1,i\)列的雷有关。

\(f[i][j][k]\)表示前\(i\)列,第\(i\)列有\(k\)个雷,第\(i-1\)列有\(j\)个雷的方案数。

转移十分显然。

时间复杂度\(\mathcal O(n)\)

源代码:

#include
#include
#include
inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x;}const int N=10001,mod=1e8+7;char s[N+1];int f[N][3][3];int main() { for(register int T=getint();T;T--) { memset(f,0,sizeof f); scanf("%s",&s[1]); const int n=strlen(&s[1]); for(register int i=1;i<=n;i++) s[i]-='0'; f[0][0][0]=1; if(s[1]>=1) f[0][0][1]=2; if(s[1]>=2) f[0][0][2]=1; for(register int i=1;i<=n;i++) { for(register int j=0;j<3;j++) { for(register int k=0;k<3;k++) { if(f[i-1][j][k]==0||j+k>s[i]||s[i]>2+j+k) continue; (f[i][k][s[i]-j-k]+=f[i-1][j][k])%=mod; if(s[i]-j-k==1) (f[i][k][1]+=f[i-1][j][k])%=mod; } } } int ans=0; for(register int i=0;i<3;i++) { (ans+=f[n][i][0])%=mod; } printf("%d\n",ans); } return 0;}

转载于:https://www.cnblogs.com/skylee03/p/9430674.html

你可能感兴趣的文章
修改字符集
查看>>
HackTheGame 攻略 - 第四关
查看>>
js删除数组元素
查看>>
带空格文件名的处理(find xargs grep ..etc)
查看>>
华为Access、Hybrid和Trunk的区别和设置
查看>>
centos使用docker下安装mysql并配置、nginx
查看>>
关于HTML5的理解
查看>>
需要学的东西
查看>>
Internet Message Access Protocol --- IMAP协议
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>
第六周
查看>>
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>
微软职位内部推荐-Senior Software Engineer II-Sharepoint
查看>>
sql 字符串操作
查看>>
【转】Android布局优化之ViewStub
查看>>
网络安全管理技术作业-SNMP实验报告
查看>>
根据Uri获取文件的绝对路径
查看>>
Flutter 插件开发:以微信SDK为例
查看>>