【动态规划】【记忆化搜索】hdu5965 扫雷
f(i,j,k)表示第i行,放的雷的状态为j{0表示不放,1表示往上放,2表示往下放,3表示上下都放},剩余还有k(0<=k<=2)个要放的方案数。
先给出我这个sb写的错误代码,死都没调出来。优越的做法在后面
#include<cstdio>
#include<cstring>
using namespace std;
#define MOD 100000007
int T,n;
char a[10010];
int f[10010][4][10];
int main(){
scanf("%d",&T);
for(;T;--T){
scanf("%s",a+1);
n=strlen(a+1);
a[0]='0';
memset(f,0,sizeof(f));
f[1][0][a[1]-'0']=1;
if(a[1]-'0'-1>=0){
f[1][1][a[1]-'0'-1]=1;
}
if(a[1]-'0'-1>=0){
f[1][2][a[1]-'0'-1]=1;
}
if(a[1]-'0'-2>=0){
f[1][3][a[1]-'0'-2]=1;
}
for(int i=1;i<n;++i){
for(int j=a[i]-'0';j>=a[i]-'0'-2 && j>=0;--j){
if(j<=2 && j+0<=a[i+1]-'0'){
if(j==0){
f[i+1][0][a[i+1]-'0']=(f[i+1][0][a[i+1]-'0']+f[i][0][0])%MOD;
}
else if(j==1){
f[i+1][1][a[i+1]-'0'-1]=(f[i+1][1][a[i+1]-'0'-1]+f[i][0][1])%MOD;
f[i+1][2][a[i+1]-'0'-1]=(f[i+1][2][a[i+1]-'0'-1]+f[i][0][1])%MOD;
}
else{
f[i+1][3][a[i+1]-'0'-2]=(f[i+1][3][a[i+1]-'0'-2]+f[i][0][2])%MOD;
}
}
}
for(int j=a[i]-'0'-1;j>=a[i]-'0'-2-1 && j>=0;--j){
if(j<=2 && j+1<=a[i+1]-'0'){
if(j==0){
f[i+1][0][a[i+1]-'0'-1]=(f[i+1][0][a[i+1]-'0'-1]+f[i][1][0])%MOD;
}
else if(j==1){
f[i+1][1][a[i+1]-'0'-2]=(f[i+1][1][a[i+1]-'0'-2]+f[i][1][1])%MOD;
f[i+1][2][a[i+1]-'0'-2]=(f[i+1][2][a[i+1]-'0'-2]+f[i][1][1])%MOD;
}
else{
f[i+1][3][a[i+1]-'0'-3]=(f[i+1][3][a[i+1]-'0'-3]+f[i][1][2])%MOD;
}
}
}
for(int j=a[i]-'0'-1;j>=a[i]-'0'-2-1 && j>=0;--j){
if(j<=2 && j+1<=a[i+1]-'0'){
if(j==0){
f[i+1][0][a[i+1]-'0'-1]=(f[i+1][0][a[i+1]-'0'-1]+f[i][2][0])%MOD;
}
else if(j==1){
f[i+1][1][a[i+1]-'0'-2]=(f[i+1][1][a[i+1]-'0'-2]+f[i][2][1])%MOD;
f[i+1][2][a[i+1]-'0'-2]=(f[i+1][2][a[i+1]-'0'-2]+f[i][2][1])%MOD;
}
else{
f[i+1][3][a[i+1]-'0'-3]=(f[i+1][3][a[i+1]-'0'-3]+f[i][2][2])%MOD;
}
}
}
for(int j=a[i]-'0'-2;j>=a[i]-'0'-2-2 && j>=0;--j){
if(j<=2 && j+2<=a[i+1]-'0'){
if(j==0){
f[i+1][0][a[i+1]-'0'-2]=(f[i+1][0][a[i+1]-'0'-2]+f[i][3][0])%MOD;
}
else if(j==1){
f[i+1][1][a[i+1]-'0'-3]=(f[i+1][1][a[i+1]-'0'-3]+f[i][3][1])%MOD;
f[i+1][2][a[i+1]-'0'-3]=(f[i+1][2][a[i+1]-'0'-3]+f[i][3][1])%MOD;
}
else{
f[i+1][3][a[i+1]-'0'-4]=(f[i+1][3][a[i+1]-'0'-4]+f[i][3][2])%MOD;
}
}
}
}
printf("%d\n",f[n][0][0]+f[n][1][0]+f[n][2][0]+f[n][3][0]);
}
return 0;
}
然后是斓爷优越的记忆化搜索
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
long long use[11000][3][3],dp[11000][3][3],qw,wq,l;
char s[11000];
long long mo=100000007;
long long num[3]={1,2,1};
long long getans(long long d,long long a,long long b)
{
if (d>l)
{
if (b!=0) return 0;
return 1;
}
if (b>2 || a+b>s[d-1]-48) return 0;
if (use[d][a][b]==qw) return dp[d][a][b];
use[d][a][b]=qw;
dp[d][a][b]=getans(d+1,b,s[d-1]-48-a-b)*num[b]%mo;
return dp[d][a][b];
} int main()
{
scanf("%lld",&wq);
for (qw=1;qw<=wq;qw++)
{
scanf("%s",&s);
l=strlen(s);
printf("%lld\n",(getans(1,0,0)+getans(1,0,1)+getans(1,0,2))%mo);
}
}
【动态规划】【记忆化搜索】hdu5965 扫雷的更多相关文章
- sicily 1176. Two Ends (Top-down 动态规划+记忆化搜索 v.s. Bottom-up 动态规划)
Description In the two-player game "Two Ends", an even number of cards is laid out in a ro ...
- Codevs_1017_乘积最大_(划分型动态规划/记忆化搜索)
描述 http://codevs.cn/problem/1017/ 给出一个n位数,在数字中间添加k个乘号,使得最终的乘积最大. 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提 ...
- Poj-P1088题解【动态规划/记忆化搜索】
本文为原创,转载请注明:http://www.cnblogs.com/kylewilson/ 题目出处: http://poj.org/problem?id=1088 题目描述: 区域由一个二维数组给 ...
- UVA_437_The_Tower_of_the_Babylon_(DAG上动态规划/记忆化搜索)
描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- 滑雪---poj1088(动态规划+记忆化搜索)
题目链接:http://poj.org/problem?id=1088 有两种方法 一是按数值大小进行排序,然后按从小到大进行dp即可: #include <iostream> #incl ...
- [NOIP2017] 逛公园 (最短路,动态规划&记忆化搜索)
题目链接 Solution 我只会60分暴力... 正解是 DP. 状态定义: \(f[i][j]\) 代表 \(1\) 到 \(i\) 比最短路长 \(j\) 的方案数. 那么很显然最后答案也就是 ...
- 动态规划——I 记忆化搜索
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- 动态规划——数字三角形(递归or递推or记忆化搜索)
动态规划的核心就是状态和状态转移方程. 对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值). 在这个 ...
- Vijos 1011 清帝之惑之顺治 记忆录式的动态规划(记忆化搜索)
背景 顺治帝福临,是清朝入关后的第一位皇帝.他是皇太极的第九子,生于崇德三年(1638)崇德八年八月二ten+six日在沈阳即位,改元顺治,在位18年.卒于顺治十八年(1661),终24岁. 顺治即位 ...
随机推荐
- Spring 路由地址的基本使用
1.下面是spring的使用基本框架连接 https://www.cnblogs.com/HD/p/4103239.html
- Android中自定义属性attr.xml的格式详解
1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> ...
- linux平台学x86汇编语言学习集合帖
linux平台学x86汇编语言学习集合帖 linux平台学x86汇编(一):https://blog.csdn.net/shallnet/article/details/45543237 linux平 ...
- 安全测试===黑客攻击常用cmd命令大全
黑客常用命令大全net user heibai lovechina /add 加一个heibai的用户密码为lovechina net localgroup Administrators heibai ...
- linux sftp and unix ftp
sftp 1.功能作用 sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性. 2.位置 /usr/bin/sftp 3.格式用法 sftp [-1246C ...
- expose a port on a living Docker container
if you have a container that with something running on its port 8000, you can run wget http://contai ...
- Struts2学习笔记04 之 拦截器
一.创建拦截器组件 1. 创建一个类,实现Interceptor接口,并实现intercept方法 2.注册拦截器 3.引用拦截器 二.拦截器栈 预置拦截器: 默认引用拦截器 拦截器调用顺序: Fil ...
- Leetcode 之Same Tree(48)
用递归比较简单,这里用迭代的方式实现.注意什么时候返回true,什么时候返回false. bool isSameTree(TreeNode *p, TreeNode *q) { stack<Tr ...
- HDU-1934
Car Plates Competition Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- 运行ceph时,了解一下主要的进程。
最简单ceph.conf配置如下: [global] fsid = 798ed076--429e-9e27-0ffccd60b56e mon_initial_members = ceph-node1 ...