[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. 基于HttpRunner的接口自动化测试平台HttpRunnerManager(二)

    https://github.com/HttpRunner/HttpRunnerManager HttpRunnerManager Design Philosophy 基于HttpRunner的接口自 ...

  2. Spring学习笔记(四)--MVC概述

    一. 飞机 最近马来西亚航空370号班机事故闹得沸沸扬扬,情节整的扑朔迷离,连我在钻研springMVC平和的心情都间接的受到了影响.正当我在想这个MVC的处理过程可以怎样得到更好的理解呢?灰机,灰机 ...

  3. Runnable和Thread实现多线程的区别(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17161237 Java中实现多线程有两种方法:继承Thread类.实现Runnable接口 ...

  4. 返回JSON到前台的对象属性设置

    1.项目中使用JSON的第三方架包:jackson-annotations-2.8.0.jar 2.可以将对象的属性返回进行相应的处理 比如格式化时间.密码敏感等属性 如:User.java pack ...

  5. .net 多线程同步的相关知识点

    在多线程开发中,共享对象的同步是经常遇到的问题,以下总结了C#中线程同步的几种技术: 1,InterLocked原子操作 Decrement(ref int location);递减1 Add(ref ...

  6. TF录像存储专项测试

    测试环境 移动设备:小米4C 移动设备版本:Android 5.1 IPC版本号:0.1.4110_10.1.1.1.3948 安居小宝版本:Version:2.0.1 测试网络:IPC使用WIFI网 ...

  7. Spring Boot Reference Guide

    Spring Boot Reference Guide Authors Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch,  ...

  8. DapperExtensions 使用教程

    最近搭建一个框架,使用dapper来做数据库访问,数据是sql server2012,支持多个数据库.事务.orm.ado.net原生操作方式,非常方便. 使用dapper的原因网上有很多文章说明,这 ...

  9. Cannot change version of project facet Dynamic Web Module to 2.4.

    解决办法,找到项目目录,将.settings  target  .classpath  .project 删除 重新引入项目 原因是 web.xml 文件里<web-app 里的与.settin ...

  10. java程序员修炼之前笔记(前半部分)

    第一部分 用java7做开发 第一章 初始java7 java7中的新特性 switch支持String 支持100_000_000数值表示法 新的异常处理 | 连接多个异常 final Except ...