题目描述
某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长。 现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的。 输入输出格式
输入格式:
第一行四个整数W、I、N、G。表示每一个字母能由几种两个字母所替代。 接下来W行,每行两个字母,表示W可以用这两个字母替代。 接下来I行,每行两个字母,表示I可以用这两个字母替代。 接下来N行,每行两个字母,表示N可以用这两个字母替代。 接下来G行,每行两个字母,表示G可以用这两个字母替代。 最后一行一个长度不超过Len的字符串。表示这个玩具的名字。 输出格式:
一行字符串,该名字可能由哪些字母变形而得到。(按照WING的顺序输出) 如果给的名字不能由任何一个字母变形而得到则输出“The name is wrong!” 输入输出样例
输入样例#1:
1 1 1 1
II
WW
WW
IG
IIII
输出样例#1:
IN
说明
30%数据满足Len<=20,W、I、N、G<=6 100%数据满足Len<=200,W、I、N、G<=16

提示是区间DP,倒着思考,从最终答案想状态定义,大概形如4个布尔f[i][j] 表示[i,j]能不能变成[1/2/3/4](对应WING)

枚举切开区间的点k,看[i,k]和[k+1,j]所有可能的组合能否合成一个点,对于判断用的dfs函数,就看能否拼成所需的点x,能就返回1

缩点思想。

//Stay foolish,stay hungry,stay young,stay simple
#include<cstdio>
#include<iostream>
#include<cstring>
#define R register
using namespace std; int cti[300]; inline int read_d(){
int s=0;
char c;
while(c=getchar(),c<'0'||c>'9');
while(c<='9'&&c>='0'){
s=s*10+c-'0';
c=getchar();
}
return s;
} int num[5];
int mat[5][20],cnt[5];
char s[202];
bool f[202][202][5];
bool vis[202][202][5]; int dfs(int l,int r,int x){
bool &ans=f[l][r][x];
if(vis[l][r][x]) return ans;
vis[l][r][x]=1;
for(int k=l;k<r;k++){//every k cut up the line into two
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if((!dfs(l,k,i))||(!dfs(k+1,r,j)))
continue;//here i and j are available
int *p=&mat[x][0];
for(int q=1;q<=cnt[x];q++)
if(*(p+q)==i*10+j)//judge if (i,j) can be x
return ans=1;
}
}
}
return 0;
} int main(){
cti['W']=1;cti['I']=2;
cti['N']=3;cti['G']=4;
for(R int i=1;i<=4;i++)
num[i]=read_d();
for(R int i=1;i<=4;i++){
for(R int j=1;j<=num[i];j++){
char x[4];
scanf("%s",x);
mat[i][++cnt[i]]=cti[x[0]]*10+cti[x[1]];
}
}
scanf("%s",s+1);
int lens=strlen(s+1);
for(R int i=1;i<=lens;i++){
f[i][i][cti[s[i]]]=1;
bool *p=&vis[i][i][1];
*p=*(p+1)=*(p+2)=*(p+3)=1;
}
bool succ=0;
if(dfs(1,lens,1)) putchar('W'),succ=1;
if(dfs(1,lens,2)) putchar('I'),succ=1;
if(dfs(1,lens,3)) putchar('N'),succ=1;
if(dfs(1,lens,4)) putchar('G'),succ=1;
if(!succ) puts("The name is wrong!");
return 0;
}

[LUOGU] P4290 [BZOJ] 1055 [HAOI2008]玩具取名的更多相关文章

  1. Bzoj 1055: [HAOI2008]玩具取名 (区间DP)

    Bzoj 1055: [HAOI2008]玩具取名 (区间DP) 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间动态规划和可 ...

  2. BZOJ 1055 [HAOI2008]玩具取名

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1119  Solved: 653[Submit][Statu ...

  3. bzoj 1055 [HAOI2008]玩具取名(区间DP)

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1258  Solved: 729[Submit][Statu ...

  4. [BZOJ 1055] [HAOI2008] 玩具取名 【记忆化搜索】

    题目链接:BZOJ - 1055 题目分析 这种类似区间 DP 的记忆化搜索都是很相近的,比如字符串压缩和字符串扩展都差不多. 都是将现在 Solve 的区间分成子区间,再求解子区间. 这道题 Sol ...

  5. [BZOJ 1055][HAOI2008]玩具取名(DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1055 分析: 比较难想的dp f[i][j][c]表示i..j能否压缩成字符c 那么怎 ...

  6. BZOJ 1055: [HAOI2008]玩具取名(记忆化搜索)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1055 题意: 思路:记忆化搜索. #include<iostream> #include ...

  7. BZOJ 1055 HAOI2008 玩具取名 动态规划

    题目大意:给定一个由'W','I','N','G'构成的字符串.给定一些规则.这些规则能够将两个字符合成为一个,比如"II"能够合成为'W',"WW"能够合成为 ...

  8. bzoj 1055: [HAOI2008]玩具取名【区间dp】

    不难想,就是处理起来比较麻烦 设f[i][j][k]为是否可以把区间(i,j)合并为k,初始状态是f[i][j][s[i]]=1,转移的话另一段枚举长度x,向(i-x,j),(i,j+x)转移 把四个 ...

  9. 【BZOJ】1055: [HAOI2008]玩具取名(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1055 我竟然都没往dp这个方向想.....百度了下看到标题是dp马上就会转移了QAQ... 设d[i ...

随机推荐

  1. poj 3294 Life Forms【SA+二分】

    先加入未出现字符间隔把n个串连起来,注意如果串开的char这个间隔字符不能溢出,把这个接起来的串跑SA,二分答案k,判断的时候把连续一段he>=k的分成一组,然后看着一段是否包含了>n/2 ...

  2. 安装elasticsearch-head

    直接安装chrome插件,用npm老出错,shit 再说吧 使用插件连接的时候反而没有出错,后续如果出错 , 可以配置 elasticsearch下config下的y 在新的电脑上使用发现格式不对,比 ...

  3. Linux源码编译处理

    1. 解决依赖问题 查询需要的依赖软件,提前安装好若使用命令行安装,一般使用默认路径:使用源码安装,则自定义安装路径,后续可能需要进行路径配置PS:可能需要在Makefile等配置文件中添加相关库文件 ...

  4. 洛谷p1115 最大子段和

    题目链接: 最大子段和 题目分析: 动态规划O(n)求解,设f[i]表示以i为终点的最大子段和 分两种情况: 若f[i-1]>0,则显然f[i]=f[i-1]+a[i](a[i]必须包含在内) ...

  5. 500 Keyboard Row 键盘行

    给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词. 详见:https://leetcode.com/problems/keyboard-row/description/ C++: cl ...

  6. solr facet查询及solrj 读取facet数据[转]

    solr facet查询及solrj 读取facet数据 | 所属分类:solr facet solrj 一.   Facet 简介 Facet 是 solr 的高级搜索功能之一 , 可以给用户提供更 ...

  7. Python实现决策树C4.5算法

    为什么要改进成C4.5算法 原理 C4.5算法是在ID3算法上的一种改进,它与ID3算法最大的区别就是特征选择上有所不同,一个是基于信息增益比,一个是基于信息增益. 之所以这样做是因为信息增益倾向于选 ...

  8. php,json数据传输(无刷新)

    废话不说直接上关键代码: js代码: <script language="javascript"> $(".login").live('click' ...

  9. [转]Linq 如何实现 in 与 not in

    本文转自:http://blog.csdn.net/zhangyumei/article/details/5620363 接触 LINQ 也有很长的一段时间了,有些在 SQL 语句中用的很顺手的东西在 ...

  10. 关于c#的结构体struct与class的区别

    C# 结构体 struct C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以包括数据成员和方法成员. 结构和类的区别: 1.结构是值类型,它在栈中分配空间:而类是引用类型,它在堆中 ...