扫雷

Problem Description
扫雷游戏是晨晨和小璐特别喜欢的智力游戏,她俩最近沉迷其中无法自拔。
该游戏的界面是一个矩阵,矩阵中有些格子中有一个地雷,其余格子中没有地雷。 游戏中,格子可能处于己知和未知的状态。如果一个己知的格子中没有地雷,那么该 格子上会写有一个一位数,表示与这个格子八连通相邻的格子中地雷总的数量。
现在,晨晨和小璐在一个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

中文题意,不概述

思路: 很容易想到的是四维的 dpdpdp,利用状态压缩表示 0,1,2,30,1,2,30,1,2,3表示这一列的状态,分别表示 00,01,10,1100,01,10,1100,01,10,11。

dp[i][j][k][l]dp[i][j][k][l]dp[i][j][k][l] 表示当前在第 iii 列,第 i−1i - 1i−1 列的状态为 jjj,第 iii 列的状态为 kkk ,第 i+1i + 1i+1 列的状态为 lll

那么这样子的复杂度是 10000 * 4 * 4 * 4 * t,而时限是 1ms1ms1ms。

这里可以优化一下,复杂度 10000 * 3 * 3 * 3 * t, dp[i][j][k][l]dp[i][j][k][l]dp[i][j][k][l] 表示当前在 第 iii 列,第 i−1i - 1i−1 列雷的个数为 jjj,第 iii 列雷的个数为 kkk,第 i+1i + 1i+1 列雷的个数为 lll,那么显然有状态转移方程
if(k+l+m==str[i]−′0′)dp[i][k][l][m]=(dp[i−1][0][k][l]+dp[i−1][1][k][l]+dp[i−1][2][k][l])∗(m==1?2:1)if(k + l + m == str[i] - '0')\ \ dp[i][k][l][m] = (dp[i - 1][0][k][l] + dp[i - 1][1][k][l] + dp[i - 1][2][k][l]) * (m == 1 ? 2 : 1)if(k+l+m==str[i]−′0′)  dp[i][k][l][m]=(dp[i−1][0][k][l]+dp[i−1][1][k][l]+dp[i−1][2][k][l])∗(m==1?2:1)   // m==1m == 1m==1 时有两种 01 与 10

Code:

#include<bits/stdc++.h>
#define debug(x) cerr << "[" << #x <<": " << (x) <<"]"<< endl
#define pii pair<int,int>
#define clr(a,b) memset((a),b,sizeof(a))
#define rep(i,a,b) for(int i = a;i < b;i ++)
#define pb push_back
#define MP make_pair
#define LL long long
#define ull unsigned LL
#define ls i << 1
#define rs (i << 1) + 1
#define fi first
#define se second
#define ptch putchar
#define CLR(a) while(!(a).empty()) a.pop()using namespace std;
inline LL read() {LL s = 0,w = 1;char ch = getchar();while(!isdigit(ch)) {if(ch == '-')w = -1;ch = getchar();}while(isdigit(ch))s = s * 10 + ch - '0',ch = getchar();return s * w;
}
inline void write(LL x) {if(x < 0)putchar('-'), x = -x;if(x > 9)write(x / 10);putchar(x % 10 + '0');
}
#ifndef ONLINE_JUDGE
clock_t prostart = clock();
#endifconst int mod = 1e8 + 7;
const int maxn = 1e4 + 70;
int dp[maxn][3][3][3]; /// i hang, (i - 1,i,i + 1) zhuangtai
int Num[4] = {0,1,1,2};
char str[maxn];int main() {#ifndef ONLINE_JUDGE
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
#endifint t = read();while(t --) {clr(dp,0);scanf("%s",str + 1);int len = strlen(str + 1);for(int j = 0; j < 4; ++ j)for(int k = 0; k < 4; ++ k)if(Num[j] + Num[k] == str[1] - '0')++ dp[1][0][Num[j]][Num[k]];for(int i = 2; i <= len; ++ i) {for(int k = 0; k < 3; ++ k) {if(k > str[i] - '0') break;for(int l = 0; l < 3; ++ l) {if(k + l > str[i] - '0') break;for(int m = 0; m < (i == len ? 1 : 3); ++ m) {if(k + l + m == str[i] - '0'){dp[i][k][l][m] = (dp[i - 1][0][k][l] + dp[i - 1][1][k][l] + dp[i - 1][2][k][l]) * (m == 1 ? 2 : 1) % mod;}}}}}LL ans = 0;for(int i = 0; i < 3; ++ i)for(int j = 0; j < 3; ++ j)ans = (ans + dp[len][i][j][0]) % mod;write(ans);ptch('\n');}#ifndef ONLINE_JUDGEcout << "time: " << 1.0 * (clock() - prostart) / CLOCKS_PER_SEC << " s" << endl;
#endifreturn 0;
}

HDU - 5965 扫雷(dp[好理解,但不那么优的题解])相关推荐

  1. HDU 5965 扫雷 递推

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

  2. flutter中 dp的理解

    flutter中 dp的理解 手机屏幕是由像素点组成的. 例:iPhone 6 Plus 采用标准的 1920×1080分辨率屏幕 就是高1920个像素点,宽1080个像素点 排列成的长方形 dpi为 ...

  3. HDU 2448 Mining Station on the Sea(Floyd+最优匹配)

    HDU 2448 Mining Station on the Sea(Floyd+最优匹配) http://acm.hdu.edu.cn/showproblem.php?pid=2448 题意: 给你 ...

  4. 深入理解JVM性能调优

    深入理解JVM性能调优 您的评价:        收藏该经验     width="728" height="90" frameborder="0&q ...

  5. 【HDU - 5965】扫雷(dp)

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

  6. HDU中一些DP的题目分类

    DP是难点,供自已以后系统学习. 1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包;第一次做的时候把概率当做 ...

  7. hdu 1520 树形dp

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

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

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

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

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

最新文章

  1. “玻璃大王”曹德旺捐资100亿办大学!
  2. 语言生成不自闭迷宫_4招教你分清自闭症、多动症、发育迟缓、抑郁症的区别...
  3. Java数据类型中String、Integer、int相互间的转换
  4. Elasticsearch之CURL命令的version控制
  5. Boost:变量类型boost :: any的单元测试
  6. 使用Apache Flume抓取数据(1)
  7. 聚类(part2)--经典聚类算法
  8. 【caffe-Windows】识别率批量输出——matlab实现
  9. 嵌入式操作系统的主要特点都有哪些
  10. python编程可以做什么菜_Python 编程! 我是菜菜菜鸟 大家帮帮忙
  11. Hiberate CRUD操作
  12. c++ 终止 超时_c++超时问题
  13. 【Computer Organization笔记27】接口电路和外部设备
  14. 深度学习之神经网络(二)
  15. 清华大学829考研 初试436经验谈
  16. phpstudy linux安装教程
  17. 樊登读书会掌控读后感_樊登读书会观后感
  18. 蒟蒻自推——稳定匹配
  19. Python网络爬虫阶段总结
  20. Tegra3--NVIDIA--黄仁勋

热门文章

  1. html5游戏开发_HTML5游戏开发–第9课
  2. LeetCode--574. 当选者
  3. 这本读者期待的芯片书《手把手教你设计CPU——RISC-V处理器》终于出版!
  4. 2019年度暨大一学年个人总结—李兆龙
  5. Python实现自动完成打字测试
  6. 台达plc 某系统的温控模块和模拟量输入模块
  7. 最小生成树-Kruskal和Prim-JAVA代码
  8. win cmd快速调取CTex集宏手册及一份不太简短的latex介绍
  9. vue是怎么实现数据响应式的?
  10. linux下jdk安装步骤_jdk下载安装步骤