【记忆化搜索】bzoj1055 [HAOI2008]玩具取名
f(l,r,c)表示sl...sr能否被合成字符c。
#include<cstdio>
#include<cstring>
using namespace std;
int m[95],n;
int mem[201][201][95];
char s[201],To[95][17][3];
bool equal(char a[],int la,int ra,char b[],int lb,int rb)
{
for(int i=la,j=lb;i<=ra;++i,++j)
if(a[i]!=b[j])
return 0;
return 1;
}
bool f(int l,int r,char c)
{
if(mem[l][r][c]!=-1) return mem[l][r][c];
if(l==r) return (s[l]==c?(mem[l][r][c]=1):(mem[l][r][c]=0));
if(r-l+1==2)
{
for(int i=1;i<=m[c];++i)
if(equal(s,l,r,To[c][i],0,1))
return mem[l][r][c]=1;
return mem[l][r][c]=0;
}
for(int i=l;i<r;++i)
for(int j=1;j<=m[c];++j)
if(f(l,i,To[c][j][0])&&f(i+1,r,To[c][j][1]))
return mem[l][r][c]=1;
return mem[l][r][c]=0;
}
int main()
{
scanf("%d%d%d%d",&m['W'],&m['I'],&m['N'],&m['G']);
for(int i=1;i<=m['W'];++i) scanf("%s",To['W'][i]);
for(int i=1;i<=m['I'];++i) scanf("%s",To['I'][i]);
for(int i=1;i<=m['N'];++i) scanf("%s",To['N'][i]);
for(int i=1;i<=m['G'];++i) scanf("%s",To['G'][i]);
scanf("%s",s); n=strlen(s);
memset(mem,-1,sizeof(mem));
bool flag=0;
if(f(0,n-1,'W')) putchar('W'),flag=1;
if(f(0,n-1,'I')) putchar('I'),flag=1;
if(f(0,n-1,'N')) putchar('N'),flag=1;
if(f(0,n-1,'G')) putchar('G'),flag=1;
if(!flag) printf("The name is wrong!");
puts("");
return 0;
}
【记忆化搜索】bzoj1055 [HAOI2008]玩具取名的更多相关文章
- BZOJ1055: [HAOI2008]玩具取名[区间DP]
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1588 Solved: 925[Submit][Statu ...
- BZOJ1055: [HAOI2008]玩具取名
... #include<bits/stdc++.h> using namespace std; int q[255]; char s[205]; char p[]={'W','I','N ...
- bzoj千题计划199:bzoj1055: [HAOI2008]玩具取名
http://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间DP dp[i][j][k] 表示区间[i,j]能否合成k #include<cst ...
- bzoj1055: [HAOI2008]玩具取名(dp)
1055: [HAOI2008]玩具取名 题目:传送门 简要题意: 就是固定四个字母,给出这四个字母分别可以由哪两个字母组成,然后在给你一个字符串,要求把这个字符串还原成原始的四个字母的其中一个. 题 ...
- [bzoj1055][HAOI2008]玩具取名_区间dp
玩具取名 bzoj-1055 HAOI-2008 题目大意:给你一个用W,I,N,G组成的字符串,给你一些这四个字符之间的变换规则,每一个变换规则都是由一个字符变成两个字符,问这个字符串是否可能是由一 ...
- BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】
题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...
- 【题解】 bzoj1055: [HAOI2008]玩具取名 (动态规划)
bzoj1055,懒得复制,戳我戳我 Solution: 区间动规(以后开始动规会在solution前面标注是啥动规 我觉的这道题挺难想了,但其实状态定义了一下子就出来了(还是不行啊) 我们定义状态\ ...
- [BZOJ 1055] [HAOI2008] 玩具取名 【记忆化搜索】
题目链接:BZOJ - 1055 题目分析 这种类似区间 DP 的记忆化搜索都是很相近的,比如字符串压缩和字符串扩展都差不多. 都是将现在 Solve 的区间分成子区间,再求解子区间. 这道题 Sol ...
- BZOJ 1055: [HAOI2008]玩具取名(记忆化搜索)
http://www.lydsy.com/JudgeOnline/problem.php?id=1055 题意: 思路:记忆化搜索. #include<iostream> #include ...
随机推荐
- MySQL使用笔记(四)数据的操作
By francis_hao Dec 14,2016 数据的操作包括插入数据记录.更新数据记录和删除数据记录. 插入数据记录 插入单条数据记录 field表示的字段名和value表示数据要一一对 ...
- git使用笔记(二)分支与合并
By francis_hao Nov 18,2016 查看分支,* 表示当前所在分支 $ git branch 查看分支和最后一次提交记录 $ git branch -v 新建分支 $ git ...
- HDU 5666 快速乘
Segment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Spring学习--HelloWorld
Spring: Spring 是一个开源框架. Spring 是为简化企业级应用开发而生,使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是一 ...
- YDB基本使用详解(转)
第七章YDB基本使用详解 一.如何与YDB对接(交互) 目前延云YDB提供如下几种方式 l命令行的方式 lWeb http接口的方式 lJDBC接口的方式 通过Java编程接入 通过可视化SQL分析统 ...
- 【UVALive4685-Succession】树形DP
http://acm.hust.edu.cn/vjudge/problem/14338 题意:给定一棵树,每个点有一个值,让你选择k个点,并且这k个点是连在一起的(从任意一个点出发,可以遍历完所有选择 ...
- codeforces 854 problem E
E. Boredom Ilya is sitting in a waiting area of Metropolis airport and is bored of looking at time t ...
- bzoj3790 manacher算法+贪心
紧跟jk大佬的步伐 这道题哇 因为机器一能生成回文串 所以我们只要用manacher跑一遍求出q[i]这样就把问题转化成了类似线段覆盖的题目 贪心就好了 至于,BIT优化dp我不会所以直接贪心了 注意 ...
- css的@符号的作用简单介绍
- PHP HERE DOCUMENT
转自: http://www.codeweblog.com/php%E4%B8%ADheredoc%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/ Here ...