[HAOI2008]玩具取名

题目描述

某人有一套玩具,并想法给玩具命名。首先他选择\(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。

\(i\)到\(k\)有前一个字符,\(k+1\)到\(j\)有后一个字符,那么就可以由一个对应的字符合成。

\(if(dp[i][k][a[h][o][1]]\&\&dp[k+1][j][a[h][o][2]])\) $dp[i][j][h]=1; $

为了方便,我们把\(W,I,N,G\)转换为\(1,2,3,4\)。

code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#define R register
#define ll long long
using namespace std;
template<typename T>inline void read(T &a){
char c=getchar();T x=0,f=1;
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
a=f*x;
}
int c[5],a[5][20][3],n,dp[205][205][5],flg;
char ch[5],s[205];
inline int num(R char x){
if(x=='W')return 1;
if(x=='I')return 2;
if(x=='N')return 3;
if(x=='G')return 4;
}
inline char cha(R int x){
if(x==1)return 'W';
if(x==2)return 'I';
if(x==3)return 'N';
if(x==4)return 'G';
}
int main(){
for(R int i=1;i<=4;i++)read(c[i]);
for(R int i=1;i<=4;i++){
for(R int j=1;j<=c[i];j++){
scanf("%s",ch+1);
a[i][j][1]=num(ch[1]);
a[i][j][2]=num(ch[2]);
}
}
scanf("%s",s+1);
n=strlen(s+1);
for(R int i=1;i<=n;i++)
dp[i][i][num(s[i])]=1;
for(R int l=2;l<=n;l++){
for(R int i=1;i<=n-l+1;i++){
R int j=i+l-1;
for(R int k=i;k<=j;k++){
for(R int h=1;h<=4;h++){
for(R int o=1;o<=c[h];o++){
if(dp[i][k][a[h][o][1]]&&dp[k+1][j][a[h][o][2]])
dp[i][j][h]=1;
}
}
}
}
}
for(R int i=1;i<=4;i++)
if(dp[1][n][i])cout<<cha(i),flg=1;
if(!flg)printf("The name is wrong!\n");
return 0;
}

【BZOJ1055】[HAOI2008]玩具取名(区间DP)的更多相关文章

  1. BZOJ1055: [HAOI2008]玩具取名[区间DP]

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

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

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

  3. 【BZOJ-1055】玩具取名 区间DP

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

  4. bzoj1055: [HAOI2008]玩具取名(dp)

    1055: [HAOI2008]玩具取名 题目:传送门 简要题意: 就是固定四个字母,给出这四个字母分别可以由哪两个字母组成,然后在给你一个字符串,要求把这个字符串还原成原始的四个字母的其中一个. 题 ...

  5. bzoj千题计划199:bzoj1055: [HAOI2008]玩具取名

    http://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间DP dp[i][j][k] 表示区间[i,j]能否合成k #include<cst ...

  6. BZOJ1055: [HAOI2008]玩具取名

    ... #include<bits/stdc++.h> using namespace std; int q[255]; char s[205]; char p[]={'W','I','N ...

  7. [bzoj1055][HAOI2008]玩具取名_区间dp

    玩具取名 bzoj-1055 HAOI-2008 题目大意:给你一个用W,I,N,G组成的字符串,给你一些这四个字符之间的变换规则,每一个变换规则都是由一个字符变成两个字符,问这个字符串是否可能是由一 ...

  8. bzoj1055玩具取名——区间DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间DP,注意初始化!! 因为没记忆化,TLE了一晚上,区间DP尤其要注意不重复递归! ...

  9. BZOJ 1055 玩具取名(区间DP)

    很显然的区间DP,定义dp[i][j][k], 如果dp[i][j][k]=1表示字符串[i,j]可以组成k字符. # include <cstdio> # include <cst ...

  10. BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】

    题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...

随机推荐

  1. 13-Oulipo(kmp裸题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1686 Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memo ...

  2. Java中的静态代理实现方式

    1.编写一个接口类 如:Subject package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p ...

  3. C++ 重载操作符- 02 重载输入输出操作符

    重载输入输出操作符 本篇博客主要介绍两个操作符重载.一个是 <<(输出操作符).一个是 >> (输入操作符) 现在就使用实例来学习:如何重载输入和输出操作符. #include ...

  4. ROS tf 编程指南

    ROS (Robot Operating System, 机器人操作系统)是最知名的机器人操作系统,广泛应用于无人驾驶和机器人,tf(transforms,坐标系转换)是ROS下的一个常用的工具库.r ...

  5. BCompare 4重置试用天数

    BCompare安装后有30天试用期,试用结束后,你可以卸载重装,以重新获得30天试用天数. BCompare的使用天数记录保存在注册表中,如果不想每次重装,也可删除对应的注册表值来重置激活天数. 命 ...

  6. 浅谈css float

    相信许多许多Web前端的朋友一定被float这个属性给困扰过吧,有时候用它来布局很方便,能够实现元素快速的水平排列,但有时候它又像一个精灵,让人无法琢磨透它方位.在网上也看了一些关于float的帖子, ...

  7. AngularJS基本使用

    简介 AngularJS是Google开源的前端JS结构化框架 Angular关注的是动态展示页面数据, 并与用户进行交互.其主体不再是DOM,而是页面中的动态数据 AngularJS特性(优点) 双 ...

  8. java修饰符 protect public protected

    1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以访问父类受保护成员(子类是可以访问父类的带protected修饰符的成员的 ...

  9. HDU 6162 Ch’s gift (线段树+树链剖分)

    题意:给定上一棵树,每个树的结点有一个权值,有 m 个询问,每次询问 s, t ,  a, b,问你从 s 到 t 这条路上,权值在 a 和 b 之间的和.(闭区间). 析:很明显的树链剖分,但是要用 ...

  10. 使用word文档直接发表博客 8 )

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...