题意是在一个 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. jquery datatable 实例操作

    var dataTables = $(".table").dataTable({ data: d,//为ajax的值,没有直接用插件自带的请求数据方式,个人觉得data的方式好控制 ...

  2. mybatis使用oracle的nulls first/nulls last

    nulls first/nulls last 顾名思义,就是在检索结果集里,有null值的时候,把null值认为是最大值,还是最小值. nulls first 放置在结果集最前面 nulls last ...

  3. Netty初体验

    package netty_starter; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFut ...

  4. git冲突解决办法合集

    一 换行符CRLF错误解决办法 1 错误产生原因 不同的操作系统使用的换行符是不一样的. unix/linux使用的是LF,max后期也采用了LF,但在windows一直采用的CRLF(回车)换行符. ...

  5. SQL UCASE() 函数

    UCASE() 函数 UCASE 函数把字段的值转换为大写. SQL UCASE() 语法 SELECT UCASE(column_name) FROM table_name SQL UCASE() ...

  6. 替换空格[by Python]

    题目: 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 1.使用python自带的repla ...

  7. linux-python3.8安装

    环境:  centos7.5 版本:python3.8 1.依赖包安装 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-deve ...

  8. 好程序员web前端开发测验之css部分

    好程序员web前端开发测验之css部分Front End Web Development Quiz CSS 部分问题与解答 Q: CSS 属性是否区分大小写? <p><font si ...

  9. day22---面向对象基础初识

    面向过程编程: 核心是过程两个字,指的是解决问题的步骤,即先干什么再干什么,基于面向过程设计的程序就好比在设计一条流水线,是一种机械的思维方式. 优点:复杂问题流程化, 缺点:程序的可扩展性差 面向对 ...

  10. Hexo + GitEE 搭建、备份、恢复、多终端

    Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页. Hexo 是使用的比较多的博客框架了,我也尝试自己搭 ...