【记忆化搜索】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 ...
随机推荐
- 获取html元素内容
html: <!DOCTYPE ><html> <head> <meta http-equiv="Content-Type" conten ...
- matlab求矩阵、向量的模
求矩阵的模: function count = juZhenDeMo(a,b) [r,c] = size(a);%求a的行列 [r1,c1] = size(b);%求b的行列 count = 0; f ...
- 问题总结——window平台下grunt\bower安装后无法运行的问题
一.问题: 安装grunt或者bower后,在cmd控制台运行grunt -version 或者 bower -v会出现:“xxx不是内部或外部命令,也不是可运行的程序或批处理文件”,
- 关于fragment点击能穿透问题
本人在做项目的过程中遇到的这个问题,然后就在网上百度了一下,之后也是在csdn上看到博友发过此类问题的解决办法,所以特此重新总结一下,顺便也给自己提个醒,避免出现此类问题.好!下面我们说一下问题: 举 ...
- HDU1025---(LIS 最长上升子序列 的应用)
分析: n行 每行包含两个整数p r;意思是p从到r 不能有交叉的路 p刚好从1->n, 可看做下标,到的地方看做值 就转化为了最长上升子序列的问题 此题难点,怎么将其转化为LIS问题 #inc ...
- 【数据结构】bzoj1636/bzoj1699排队
Description 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置 ...
- codevs1063 合并果子 优先队列(小根堆)
题目传送门 这道题很容易想到优先把两堆重量最小的合并比较优 然后乱搞一下就可以啦 #include<cstdio> #include<cstring> #include< ...
- 【洛谷 P2346】四子连棋(状态压缩,搜索)
其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio ...
- 流程控制 while循环 运算符
具体知识戳这里 可变数据类型:在id不变的情况下,数据类型内部的元素(value)可以改变 如:列表,字典 不可变类型:value改变,id也跟的改变 如:数字.字符.布尔类型 运算符 #算数运算符# ...
- string与double的互相转换
#include <iostream> #include <string> #include <sstream> string DoubleToString(dou ...