题意是在一个 3 行 n 列的图上进行扫雷,中间一行没有雷,且中间一行的每一格都会显示周围的雷数,问根据已知的雷数在上下两行设置地雷的方法数。

分析知每一列所填雷数的和与周围的雷数有关,但每列具体的填法只影响方法数,不影响周围的雷数统计,而且每列的雷数只有 0,1,2 这三种,

用数组 dp[ ] 来记录每列的雷数,用数组 a[ ] 来记录所给的信息( 每一列出现的周围雷数的统计 ),则:

dp[ pos ] = a[ pos - 1 ] - dp[ pos - 1 ] - dp[ pos - 2 ];

dp[ 0 ] = 0

令 dp[ 1 ] = 0,用转移方程得到数组 dp[ ] 之后,对于每一列雷数和为 0 或 2 的情况,该列都只有一种填法,而对于每一列雷数和为 1 的情况,该列有两种填法,

用乘法原理可知:当 dp[ 1 ] = 0 时,ans =  pow(2, 单列雷数和为 1 的列数);

同理,再求出当 dp[ 1 ] = 1 和 dp[ 1 ] = 2 的 ans,答案即为三个 ans 的和,但要注意若在求解 dp[ ] 的过程中出现所填雷数已超过规定雷数的情况或者要填多于 2 的

雷数,则该情况下的 ans不能被求和 (事实上也无法正确求出 ans )

分析样例:22

i 的值分别取 0,1,2,则 dp[ 1 ] = {0,1,2},dp[ 2 ] 则分别填 2,1,0,

那么答案就是 sum = 1( dp[ 1 ] = 0, dp[ 2 ] = 2 ) + 4 ( dp[ 1 ] = 1, dp[ 2 ] = 1 ) + 1( dp[ 1 ] = 2, dp[ 2 ] = 0 ) = 6

代码如下:

 #include <bits/stdc++.h>
using namespace std;
const int mod = 1e8+;
int main()
{
std::ios::sync_with_stdio(false);
int t,len,pos,f,a[],dp[];
long long ans,sum;
string s;
cin >>t;
while(t--)
{
cin >> s;
len = s.length();
for(int i = ; i < len; ++i)
a[i+] = s[i] - '';
sum = ;
for(int i = ; i <= a[] && i <= ; ++i)
{
ans = ;
f = ;
dp[] = ;
dp[] = i;
for(pos = ; pos <= len; ++pos)
{
dp[pos] = a[pos-] - dp[pos-] - dp[pos-];
if(dp[pos]<||dp[pos]>)
{
f = ;
break;
}
}
if(pos==len+ && dp[len]+dp[len-]!=a[len])
f = ;
if(f)
{
for(int j = ; j <= len; ++j)
if(dp[j]==) ans=ans*%mod;
sum = (ans+sum)%mod;
}
}
cout << sum << endl;
}
return ;
}

感谢这些博客的作者:

与本题题解相关:

https://blog.csdn.net/elbadaernu/article/details/54773033

https://www.cnblogs.com/heimao5027/p/6033812.html

关于手动扩大栈内存(第二篇题解中涉及到这种用法,但本人的题解思路主要借鉴了第一篇题解):

https://blog.csdn.net/shahdza/article/details/6586430

https://blog.csdn.net/f_zyj/article/details/51467501

https://www.cnblogs.com/aininot260/p/9627100.html

关于GCC优化:

https://blog.csdn.net/u010796610/article/details/69352484

https://blog.csdn.net/jiayanhui2877/article/details/11615471

HDU 5965(三行扫雷 dp)的更多相关文章

  1. HDU 5965:扫雷(DP,递推)

    扫雷 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  2. HDU 5965 枚举模拟 + dp(?)

    ccpc合肥站的重现...一看就觉得是dp 然后强行搞出来一个转移方程 即 根据第i-1列的需求和i-1 i-2列的枚举摆放 可以得出i列摆放的种类..加了n多if语句...最后感觉怎么都能过了..然 ...

  3. HDU5965 扫雷 —— dp递推

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5965 题解: 1. 用a[]数组记录第二行的数字,用dp[]记录没一列放的地雷数.如果第一列的地雷数d ...

  4. HDU 1011 树形背包(DP) Starship Troopers

    题目链接:  HDU 1011 树形背包(DP) Starship Troopers 题意:  地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...

  5. hdu 2296 aC自动机+dp(得到价值最大的字符串)

    Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. HDU 4778 状压DP

    一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...

  7. HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解)

    HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解) 题意分析 要先排序,在做01背包,否则不满足无后效性,为什么呢? 等我理解了再补上. 代码总览 #in ...

  8. HDOJ(HDU).2546 饭卡(DP 01背包)

    HDOJ(HDU).2546 饭卡(DP 01背包) 题意分析 首先要对钱数小于5的时候特别处理,直接输出0.若钱数大于5,所有菜按价格排序,背包容量为钱数-5,对除去价格最贵的所有菜做01背包.因为 ...

  9. HDOJ(HDU).2602 Bone Collector (DP 01背包)

    HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...

随机推荐

  1. Python爬虫之Beautiful Soup库的基本使用

  2. Spark SQL中列转行(UNPIVOT)的两种方法

    行列之间的互相转换是ETL中的常见需求,在Spark SQL中,行转列有内建的PIVOT函数可用,没什么特别之处.而列转行要稍微麻烦点.本文整理了2种可行的列转行方法,供参考. 本文链接:https: ...

  3. kernel笔记——定时器与时间管理

    内核中时钟主要完成以下作用: 记录系统运行时间 完成时间相关的统计功能,如cpu占用率等 定时功能,设定某个进程一段时间后完成某项任务 为实现以上功能,硬件以及内核提供了不同类型的时钟. RTC 实时 ...

  4. 26 python 初学(线程、同步锁、死锁和递归锁)

    参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html 并发:一段时间内做一些事情 并行:同时做多件事情 线程是操作系统能够进行运算调度的基本单位 ...

  5. 基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件

    目录 1. 前言 2. 关于vue-simple-uploader 3. 基于vue-simple-uploader封装全局上传组件 4. 文件上传流程概览 5. 文件分片 6. MD5的计算过程 7 ...

  6. yum 彻底删除nodejs,重新安装

    第一步 用自带的包管理先删除一次 yum remove nodejs npm -y1手动删除残留 进入 /usr/local/lib 删除所有 node 和 node_modules文件夹进入 /us ...

  7. iview render input每输入一个字符就会自动跳出焦点

    假如你绑定的table的数据是tableData,input数据改变的时候你把整行的数据替换掉,就不会造成table重新渲染,导致input失焦了 h('InputNumber', { props: ...

  8. MySQL中的float和decimal类型有什么区别

    decimal 类型可以精确地表示非常大或非常精确的小数.大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性.该类型对于必须避免舍入错误的应用程序( ...

  9. spring cloud实战与思考(二) 微服务之间通过fiegn上传一组文件(上)

    需求场景: 微服务之间调用接口一次性上传多个文件. 上传文件的同时附带其他参数. 多个文件能有效的区分开,以便进行不同处理. Spring cloud的微服务之间接口调用使用Feign.原装的Feig ...

  10. 网络基础之HTTP、TCP/IP、Socket

    一.HTTP相关 https://www.cnblogs.com/sunny-sl/p/6529830.html https://www.cnblogs.com/ranyonsue/p/5984001 ...