【记忆化搜索】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 ...
随机推荐
- 特殊密码锁 的通过码是:(请注意,在openjudge上提交了程序并且通过以后,就可以下载到通过码。请注意看公告里关于编程作业的说明)
// // main.cpp // openjudge特殊密码锁 // // Created by suway on 17/11/20. // Copyright © 2017年 suway. // ...
- java的多构造函数的处理方式
/** * */ package P; import java.awt.List; import java.lang.reflect.Array; import java.util.ArrayList ...
- poj3683 2-sat Priest John's Busiest Day
Description John is the only priest in his town. September 1st is the John's busiest day in a year b ...
- c++(类) this指针
this指针的相关概念: this只能在成员函数中使用.全局函数,静态函数都不能使用this.实际上,成员函数默认第一个参数为T* const register this. 为什么this指针不能再静 ...
- js实现日历
有这样一个普通的日历需求 第一反应就是找插件,结果找到了,但是改起来非常麻烦,然后查下实现的原理,发现原来很简单,于是自己实现了一个. 首先分析一下这个组件,每页显示的是 当前月的所有日期及所占据的行 ...
- [BZOJ3261&BZOJ3166]可持久化trie树及其应用
可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...
- BZOJ1082_栅栏_C++
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1082 题解:http://www.cnblogs.com/hadilo/p/5924546.h ...
- bzoj 2662&bzoj 2763 SPFA变形
我们用dis[i,j]代表到i这个点,用j张票的最短路程,那么我们只需要在SPFA更新 的时候,用dis[i,j]更新dis[p,j]和dis[p,j+1]就行了 /***************** ...
- [Leetcode Week9]Word Break II
Word Break II 题解 题目来源:https://leetcode.com/problems/word-break-ii/description/ Description Given a n ...
- CF#328 (Div. 2) C(大数)
C. The Big Race time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...