题干:

扫雷游戏是晨晨和小璐特别喜欢的智力游戏,她俩最近沉迷其中无法自拔。
该游戏的界面是一个矩阵,矩阵中有些格子中有一个地雷,其余格子中没有地雷。 游戏中,格子可能处于己知和未知的状态。如果一个己知的格子中没有地雷,那么该 格子上会写有一个一位数,表示与这个格子八连通相邻的格子中地雷总的数量。
现在,晨晨和小璐在一个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[n][3][3],dp[i][j][k]代表第i列放置了j个地雷,第i-1列放置k个地雷的前缀合法方案数。更新的时候直接更新到第n+1列,这样就不用特判了。直接取值就行。注意注释掉的那一句,不需要特判,当时是想的,剩下那些状态都是非法的了,所以不需要进行更新了,但是其实更新了也没关系,因为反正也用不到,也就是说你可以更新了,但是不取这个值就可以了。

再就是数组需要开到dp[n][9][9],因为虽然你用不到这些值,但是你状态转移方程中可能会用到这些非法值,所以为了防止越界,需要数组开大一点。(当然,你直接用ifelse特判掉越界情况也可以,但是比较麻烦)

至于为什么要更新到n+1列,是因为你更新到第i列的时候,可完全确定的是第i-1列的值,所以要完全确定第n列的值,需要第n+1列的状态,只不过取  让第n+1列放置地雷个数为0  的状态就好了。

其实还有更简单的方法,因为第一列的值定下来,通过s[1],第二列地雷肯定也是定的,而通过s[2]又可以确定s[3],以此类推,所以只要第一列的值确定了,后面的值都确定了,所以也可以直接递推过去。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 20000 + 5;
const ll mod = 100000007;
char s[MAX];
ll dp[MAX][10][10];
int main()
{int T;cin>>T;while(T--) {scanf("%s",s+1);int n = strlen(s+1);s[n+1]=s[n]+9;for(int i = 1; i<=n+1; i++) {for(int j = 0; j<3; j++) {for(int k = 0; k<3; k++) dp[i][j][k]=0;}}for(int j = 0; j<3; j++) {if(j > s[1]-'0') continue;if(j == 1) dp[1][j][0]=2;else dp[1][j][0]=1;}for(int i = 2; i<=n+1; i++) {for(int j = 0; j<3; j++) {
//              if(i == n+1 && j>0) continue;for(int k = 0; k<3; k++) {if(s[i]-'0' < j+k) continue;if(s[i-1]-'0' < j+k) continue;//这句去掉其实也能过,但是有RE风险dp[i][j][k] += dp[i-1][k][s[i-1]-'0'-j-k];if(j == 1) dp[i][j][k] += dp[i-1][k][s[i-1]-'0'-j-k];dp[i][j][k] %= mod;}}}ll ans = 0;for(int k = 0; k<3; k++) ans = (ans+dp[n+1][0][k])%mod;printf("%lld\n",ans);}return 0 ;
}

【HDU - 5965】扫雷(dp)相关推荐

  1. HDU - 5965 扫雷(dp[好理解,但不那么优的题解])

    扫雷 Problem Description 扫雷游戏是晨晨和小璐特别喜欢的智力游戏,她俩最近沉迷其中无法自拔. 该游戏的界面是一个矩阵,矩阵中有些格子中有一个地雷,其余格子中没有地雷. 游戏中,格子 ...

  2. HDU 5965 扫雷 递推

    扫雷游戏是晨晨和小璐特别喜欢的智力游戏,她俩最近沉迷其中无法自拔. 该游戏的界面是一个矩阵,矩阵中有些格子中有一个地雷,其余格子中没有地雷. 游戏中,格子可能处于己知和未知的状态.如果一个己知的格子中 ...

  3. hdu 1520 树形dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 #include<cstdio> #include<cstring> # ...

  4. hdu 4035 可能性DP 成都网络游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=4035 获得: 1.首先推断是不是树.事实上,所有的感觉身影,既看边数==算-1是不成立 2.有时候,我告诉孩子来 ...

  5. HDU 2836 (离散化DP+区间优化)

    Reference:http://www.cnblogs.com/wuyiqi/archive/2012/03/28/2420916.html 题目链接: http://acm.hdu.edu.cn/ ...

  6. hdu 5568(dp+大数模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5568 官方题解: #include <cstdio> #include <cstri ...

  7. hdu 5464(简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5464 解题思路: 由于p很小,而ai很大,所以先把ai%p,由于ai可能有负数,所以ai=(ai%p+ ...

  8. hdu 5433(bfs+dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5433 解题思路: dp[i][j][k]表示在(x,y)点,毅力为k时的最小体力.由于每个点可能会走多 ...

  9. HDU 2859 Phalanx (dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 给你一个n*n的矩阵,问你最大的对称度是多少(左下右上为对称线) dp[i][j]表示i行j列元 ...

最新文章

  1. 知乎上这个程序员火了,竟是因为给老板修了一 次U盘
  2. C#汉字转换拼音技术详解(高性能)
  3. 《SpringCloud超级入门》Eureka自我保护模式和InstanceID的配置《十四》
  4. Docker的新版本,R软件包的R-Hub以及更多新闻
  5. 基于JAVA+Servlet+JSP+MYSQL的航空订票系统
  6. osg 镜面_浙江天梭手表镜面抛光
  7. 基于matlab的谐波处理及无功功率补偿源码,谐波抑制和无功功率补偿(第3版) pdf epub mobi txt 下载...
  8. 【资源导航】我所用到过的工具及下载地址
  9. Linux 操作系统基础知识总结
  10. linux重启tomcat命令
  11. Cadence Allegro修改静态铜皮为动态铜皮图文教程及视频演示
  12. Vue开发实例(11)之el-menu实现左侧菜单导航
  13. python游戏编程快速上手pdf_Python游戏编程快速上手 (斯维加特著) 中文pdf完整版[18MB]...
  14. 特征选择之Relief算法与Relief-F算法
  15. 游戏行业的发展前景分析
  16. 通过LIO工具 挂载共享 rbd 块设备
  17. linphone 手机上不能接听电话
  18. 【等保】等保2.0与等保1.0的区别变化看这里!
  19. Qt httpserver 理解与使用
  20. 51单片机——1602液晶显示

热门文章

  1. C++总结笔记(二)面向对象
  2. ContentType的类型
  3. 张掖计算机职称考试,甘肃省张掖市2018年3月计算机等级考试公告
  4. java 怎么用 string method return数量_java教程之Map应该怎么用
  5. eclipse 快捷键及插件
  6. java实现记事本查找_Java实现记事本
  7. python各版本区别_关于python中不同版本的print区别
  8. wince 6.0 pb
  9. asterisk版本选择
  10. 定制mini2440 wince启动界面