HDU5965 扫雷 —— dp递推
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5965
题解:
1.
用a[]数组记录第二行的数字,用dp[]记录没一列放的地雷数。如果第一列的地雷数dp[1]已知,那么第二列的地雷数dp[2]可以确定了(因为a[1] = dp[0] + dp[1] + dp[2], dp[0]虚设), dp[2] = a[1] - dp[0] - dp[1]; 于是第三列也已知:dp[3] = a[2] - dp[1] - dp[2]。 所以状态转移方程为:dp[i] = a[i-1] - dp[i-2] - dp[i-1]。
所以只需枚举第一列的地雷数就可以了。
在递推的过程中,每一列的地雷数必须在0~2的范围内,如果超出,则方案不符合,break;
递推到第n+1个格子,如果dp[n+1] = 0, 则证明这种方案合法,更新答案。
2.
特殊点是i=0 和 i=n+1,因为可以假设他们存在,但却不能放地雷,所以可以通过他们判断方案是否合法。
突破口是i=1,因为i=1时,相邻边只有一条,知道自己,就可以知道相邻,然后一直递推下去。
代码如下:
#include<iostream>//hdu 5965 递推
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define mod 100000007 using namespace std;
typedef long long LL; int dp[10005];
char a[10005]; int main()
{
int t,i,j,ans,sum;
scanf("%d",&t);
while(t--)
{
scanf("%s",a+1);
int n = strlen(a+1);
for(i = 1; i<=n; i++)
a[i] -= '0'; ans = 0;
for(i = 0; i<=a[1] && i<=2; i++)//枚举第一列,i为第一列的地雷数
{
dp[1] = i; for(j = 2; j<=n+1; j++)//从第二列开始递推
{
dp[j] = a[j-1]-dp[j-1]-dp[j-2];
if(dp[j]>2)
break;
} if(j==n+2 && dp[n+1] == 0)
{
sum = 1;
for(j = 1; j<=n; j++)
{
if(dp[j]==1)
sum = (sum*2)%mod;
}
ans = (ans + sum)%mod;
}
}
printf("%d\n",ans);
} }
HDU5965 扫雷 —— dp递推的更多相关文章
- hdu5965扫雷 枚举+递推
题目链接 思路:枚举第一列的可能种数,然后递推即可,中途判断是否满足条件,最后再判断最后一列是否满足条件即可. #include<bits/stdc++.h> #define LL lon ...
- 【BZOJ1088】扫雷(递推)
[BZOJ1088]扫雷(递推) 题面 BZOJ 题解 忽然发现这就是一道逗逼题. 只需要枚举一下第一个是什么,后面都能够推出来了.. #include<iostream> using n ...
- hdu2089(数位DP 递推形式)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 2604 Queuing(dp递推)
昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...
- Power oj2498/DP/递推
power oj 2498 /递推 2498: 新年礼物 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 12 Accepted: 3 ...
- BZOJ4321queue2——DP/递推
题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两 人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行: 现在想知道,存在多少方案满足沙茶们如此不苛刻的条件. ...
- Shell Necklace (dp递推改cdq分治 + fft)
首先读出题意,然后发现这是一道DP,我们可以获得递推式为 然后就知道,不行啊,时间复杂度为O(n2),然后又可以根据递推式看出这里面可以拆解成多项式乘法,但是即使用了fft,我们还需要做n次多项式乘法 ...
- hdu 1723 DP/递推
题意:有一队人(人数 ≥ 1),开头一个人要将消息传到末尾一个人那里,规定每次最多可以向后传n个人,问共有多少种传达方式. 这道题我刚拿到手没有想过 DP ,我觉得这样传消息其实很像 Fibonacc ...
- UVA 10559 Blocks(区间DP&&递推)
题目大意:给你玩一个一维版的消灭星星,得分是当前消去的区间的长度的平方,求最大得分. 现在分析一下题目 因为得分是长度的平方,不能直接累加,所以在计算得分时需要考虑前一个状态所消去的长度,仅用dp[l ...
随机推荐
- mysql 设置默认id自增开始下标
alter table 表名 AUTO_INCREMENT 此处写你想让id从几开始增长的数字:
- erlang debugger
http://erlang.org/doc/apps/debugger/debugger_chapter.html
- Android自定义Dialog效果
上面是效果图. 使用方法: NiftyDialogBuilder dialogBuilder=NiftyDialogBuilder.getInstance(this); dialogBuilder . ...
- DICOM医学图像处理:Deconstructed PACS之Orthanc,Modification & Anonymization
背景: 上篇博文为引子,介绍了一款神奇的开源PACS系统——Orthanc.本篇开始解读官方Cookbook中的相关内容,对于简单的浏览.访问和上传请阅读前篇博文.在常规的PACS系统中还未出现对于D ...
- Hierarchical data in postgres
https://coderwall.com/p/whf3-a/hierarchical-data-in-postgres --------------------------------------- ...
- 利用VideoView播放视频
package com.qianhua.ui; 002 003 import android.app.Activity; 004 import android.content.Intent; 00 ...
- sql的一些知识_函数_汇总数据
汇总数据 avg()---------求平均数 值得注意的是:avg()只能用于一个列的平均值查询,多个列的平均值请使用多个avg() avg()忽略null值 count()-------计数(指定 ...
- centos7+ 安装Docker 17.03.2
cnetos7 安装 docker17.03.2 升级内核 http://m.blog.csdn.net/article/details?id=52047780 注意切换内核时查看 新内核位置 awk ...
- vue2.0 + vux 项目搭建
1.快速搭建项目模板 因为项目使用vux,所以推荐使用vux官网的airyland/vux2 模板,vue-cli工具是vue项目的搭建脚手架 默认为 webpack2 模板,如果你需要使用webpa ...
- mysql 存储引擎 InnoDB 与 MyISAM 的区别和选择
http://www.blogjava.net/jiangshachina/archive/2009/05/31/279288.html 酷壳 - MySQL: InnoDB 还是 MyISA ...