传送门

扫雷游戏是晨晨和小璐特别喜欢的智力游戏,她俩最近沉迷其中无法自拔。
该游戏的界面是一个矩阵,矩阵中有些格子中有一个地雷,其余格子中没有地雷。 游戏中,格子可能处于己知和未知的状态。如果一个己知的格子中没有地雷,那么该 格子上会写有一个一位数,表示与这个格子八连通相邻的格子中地雷总的数量。
现在,晨晨和小璐在一个3行N列(均从1开始用连续正整数编号)的矩阵中进 行游戏,在这个矩阵中,第2行的格子全部是己知的,并且其中均没有地雷;而另外 两行中是未知的,并且其中的地雷总数量也是未知的。
晨晨和小璐想知道,第1行和第3行有多少种合法的埋放地雷的方案。
Input
包含多组测试数据,第一行一个正整数T,表示数据组数。
每组数据由一行仅由数字组成的长度为N的非空字符串组成,表示矩阵有3行N 列,字符串的第i个数字字符表示矩阵中第2行第i个格子中的数字。
保证字符串长度N <= 10000,数据组数<= 100。
Output
每行仅一个数字,表示安放地雷的方案数mod100,000,007的结果。
Sample Input
2
22
000
Sample Output
6
1

思路:刚开始觉得是状压dp,然后枚举了三列的状态,一直超时,,没想到怎么优化,后来看了别人博客发现,只需要枚举两列就行了,第三列可以根据已知的这两列算出来。。dp[i][j][k]表示第i列地雷数为j,第 i-1 列地雷数为k的情况下的方案数有多少种。

或者直接递推,第一列的状态确定了,后面的就都确定了。每一列地雷数为1的话有两种放法,0或者2只有1种方法,所以只需要枚举第一列的地雷数,然后依次计算即可,时间复杂度为O(n)

dp做法:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 1e4+10,mod = 1e8+7;
int dp[N][10][10];
int main()
{ios::sync_with_stdio(false);cin.tie(0);int t,n;cin>>t;while(t--){string s;cin>>s;n=s.size();s=" "+s;for(int i=0;i<=n;i++)for(int j=0;j<3;j++)for(int k=0;k<3;k++)dp[i][j][k]=0;for(int i=0;i<3;i++){if(i>s[1]-'0') continue;if(i==1) dp[1][i][0]=2;else dp[1][i][0]=1;}for(int i=2;i<=n;i++){for(int j=0;j<3;j++)for(int k=0;k<3;k++){if(s[i-1]-'0'<j+k || s[i]-'0'<j+k) continue;int x=s[i-1]-'0'-j-k;dp[i][j][k]=(dp[i][j][k]+dp[i-1][k][x])%mod;if(j==1) dp[i][j][k]=(dp[i][j][k]+dp[i-1][k][x])%mod;}}int ans=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)if(i+j==(s[n]-'0'))  //只计算合法的方案数ans=(ans+dp[n][i][j])%mod;cout<<ans<<endl;}return 0;}


递推做法:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 2e5+10,mod=1e8+7;
int num[N];
int main()
{ios::sync_with_stdio(false);cin.tie(0);int t;cin>>t; while(t--){string s;cin>>s;int n=s.size();int ans=0;s=" "+s;for(int i=0,j;i<3;i++){if(i>s[1]-'0') continue;num[1]=i;int sum=(i==1)?2:1;for(j=2;j<=n;j++){int x=(s[j-1]-'0')-num[j-1]-num[j-2];if(x==1) sum=sum*2%mod;else if(x<0||x>2) break;num[j]=x;}if(j<=n||(num[n-1]+num[n]!=s[n]-'0')) continue;ans=(ans+sum)%mod;}cout<<ans<<endl;}return 0;
}

HDU-5965 扫雷(dp / 递推)相关推荐

  1. HDU 4489 (DP递推计数)

    DP 递推计数 题意: 这是一道比较神奇的题,很考验思维:有n个高低不同的人,现在需要进行排列,排列一定要满足两种方式 高低高··· 低高低··· 求出有多少排列方式. 思路: 我们的切入点是第i个人 ...

  2. Two Arrays(DP递推)

    You are given two integers nn and mm. Calculate the number of pairs of arrays (a,b)(a,b) such that: ...

  3. 动态规划入门之dp递推~

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/--萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗-- 本篇文章重在递推,不 ...

  4. hdu 1723 DP/递推

    题意:有一队人(人数 ≥ 1),开头一个人要将消息传到末尾一个人那里,规定每次最多可以向后传n个人,问共有多少种传达方式. 这道题我刚拿到手没有想过 DP ,我觉得这样传消息其实很像 Fibonacc ...

  5. hdu 2013 蟠桃记-递推-[解题报告]C++

    蟠桃记 问题描述 : 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题! 什么问题?他研究的问题是蟠桃一共有多少个! 不过,到最 ...

  6. HDU - 3336 next运用+递推

    题目的匹配应该也要看成一个文本串与另一个模式串的匹配过程 Text是以当前i结尾的后缀来匹配Pattern的前缀(非真) 这里的Pattern肯定是可以匹配成功的,直接由next来保证(next总是当 ...

  7. POj 3420 Quad Tiling 状态压缩DP+递推+矩阵快速幂

    哈哈,写了好久的,总算对了. 接下来介绍两种思路: 先介绍一种   递推+矩阵的快速幂的方法 一种DP的思想考虑4×n的最后一列  ,可以放的方法一共有5种 1.放4个 1×2  则 为dp[n-2] ...

  8. BZOJ 3329: Xorequ(数位dp+递推)

    传送门 解题思路 可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\).那么第一问就是一个简单的数位\(dp\),第二问考 ...

  9. Power oj2498/DP/递推

    power oj 2498 /递推 2498: 新年礼物 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submit: 12 Accepted: 3 ...

最新文章

  1. 第十六界智能车竞赛:这问题怎么越来越多了呢?
  2. Activity管理(三):activity内核管理方案详细讲解
  3. 基于rman 全备+归档在线搭建DG
  4. 10个经典而简单的jQuery特效设计在线演示
  5. 利用反射,实现动态调用winform窗体
  6. 定时任务重启后执行策略_C语言操作时间函数time.ctime,实现定时执行某个任务小例子...
  7. 提取多个字段_【博客翻译】建筑物轮廓线提取以及损坏分类
  8. 数列分块入门 7(LibreOj-6283)
  9. 求两个整数中的最大值(不能用比较语句,循环语句)
  10. idea代码补全_IDEA中有哪些让你相见恨晚的技巧?
  11. 想要升级Big Sur?你的Mac与Big Sur兼容吗?
  12. HTML5 Canvas 绘制英国国旗
  13. 拓端tecdat|matlab使用样条插值重采样估计INR数据研究
  14. 谷歌大脑科学家 Caffe缔造者 贾扬清 微信讲座
  15. SDM439/SDM429/SDM450 Sensors Overview (80-PF208-11)
  16. 关于BigDecimal.ROUND_HALF_EVEN银行家算法
  17. Java实现获取long类型的随机数
  18. 2021-07-30 es6 -第4章和String复习
  19. python urllib2爬虫下的一些坑和感悟
  20. dwasp连接mysql_asp连接access数据库代码(ASP连接ACCESS数据库方式方法)包含.mdb和.accdb两种格式...

热门文章

  1. 【CSS】987- 十几个 CSS 高级技巧汇总
  2. 网易云音乐再成功融资!2018年成数字音乐资本大年
  3. 【大数据处理技术】期末复习整理
  4. 中国工商银行网银不能识别U盾或打不开网页
  5. APP手机软件开发方案怎么做?
  6. Openwrt无线管理工具/命令
  7. java基础数据类型大小
  8. OTM应用能解决人工智能领域的数据安全问题
  9. 跨考哈工程计算机考研科目,2021二战跨考哈工程电子信息初试经验
  10. 解决桌面图标有蓝色阴影的问题