P4290 [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

从一串很长的字符串变为一个字母

从两个字母变回一个字母可以用一个映射来表示

先预处理一下每一次字符对应的映射

W = 1,I = 2,N = 3,G = 4

在代码中,就是你每一个数能够被替代的方式里面

第i个数到他的第j中 替代方法的映射,方便之后的转移

可以用f(i,j,k)

i表示是第i个数,j表示第i个数的第j中替代方法

然后k只有两个数1和2表示能够替代那一个字符的两个字符分别是什么

这样完成之后就可以开始DP了

dp(i,j,k)

i表示区间的左端点,j表示区间的右端点,k表示从i到j这一串字符串可以合并成的那一个字符

先初始化一下,将每一个从自己到自己能够合成的字符串初始化为自己所在位置上的字符

然后5重循环,枚举的内容在代码里面

最后检验从1到字符串最后,上面那四个数是不是又可以合并出来的

从第一个枚举到第四个一旦可以就输出

保证顺序是按照WING的

【完整代码】

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
int num[5];
map<char,int> w;
int f[5][20][3];
bool dp[205][205][5];
char a,b;
char s[205] = "0";
int len;
char ans[10] = {"0WING"};
int main()
{
w['W'] = 1,w['I'] = 2,w['N'] = 3,w['G'] = 4;
for(int i = 1;i <= 4;++ i)scanf("%d",&num[i]);
for(int i = 1;i <= 4;++ i)
for(int j = 1;j <= num[i];++ j)
{
cin >> a >> b;
f[i][j][1] = w[a];
f[i][j][2] = w[b];
}
scanf("%s",s + 1);
len = strlen(s) - 1;
// cout << len << endl;
for(int i = 1;i <= len;++ i)dp[i][i][w[s[i]]] = 1; for(int i = 2;i <= len;++ i)//枚举区间长度
for(int l = 1,r = l + i - 1;l <= len - i + 1;l ++,r ++)//枚举区间的左端点和区间的右端点
for(int j = 1;j < i;++ j)//总的区间拼出来的数是由哪两个分区间组合出来的,也就是两个区间的交界处
for(int k = 1;k <= 4;++ k)//枚举WING
for(int z = 1;z <= num[k];++ z)//WING能够被组合出来的方案
if(dp[l][l + j - 1][f[k][z][1]] && dp[l + j][r][f[k][z][2]])//可行
dp[l][r][k] = 1;//标记
int fg = 0;
for(int i = 1;i <= 4;++ i)
{
if(dp[1][len][i] == true)
{
fg = 1;
cout << ans[i];
}
}
if(fg == 0)
cout << "The name is wrong!" << endl;
return 0;
}

洛谷 4290 [HAOI2008]玩具取名 题解的更多相关文章

  1. 洛谷 P4290 [HAOI2008]玩具取名

    传送门 思路 博客半年没更新了,来更新个博文吧 在\(dsr\)聚聚博客的帮助下,我用半个上午和一个中午的时间苟延残喘地完成了这道题 先是读题目读大半天,最后连个样例都看不懂 之后又是想思路,实在想不 ...

  2. 洛谷 P2512 [HAOI2008]糖果传递 题解

    每日一题 day47 打卡 Analysis 首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示. 假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小 ...

  3. DP【洛谷P4290】 [HAOI2008]玩具取名

    P4290 [HAOI2008]玩具取名 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用"WI ...

  4. 【BZOJ1055】[HAOI2008]玩具取名(动态规划)

    [BZOJ1055][HAOI2008]玩具取名(动态规划) 题面 BZOJ 洛谷 题解 裸的区间\(dp\),设\(f[i][j][W/I/N/G]\)表示区间\([i,j]\)能否由某个字母替换过 ...

  5. BZOJ 1055 [HAOI2008]玩具取名

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

  6. 【BZOJ1055】[HAOI2008]玩具取名(区间DP)

    [HAOI2008]玩具取名 题目描述 某人有一套玩具,并想法给玩具命名.首先他选择\(WING\)四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用" ...

  7. 【bzoj1055】[HAOI2008]玩具取名

    [bzoj1055][HAOI2008]玩具取名 2014年12月1日3,0111 Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名 ...

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

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

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

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

随机推荐

  1. Delphi开发的数据库程序在C:\PDOXUSRS.NET生成文件,拒绝访问及读写权限

    Delphi开发的数据库程序在C:\PDOXUSRS.NET生成文件,拒绝访问及读写权限, "无法打开 PARADOX.NET.这个文件可以随便删除的,下次会自动产生. Permission ...

  2. NetCore实例提供的依赖注入的生命周期

    Transient: 每一次GetService都会创建一个新的实例,每次从容器 (IServiceProvider)中获取的时候都是一个新的实例Scoped: 在同一个Scope内只初始化一个实例 ...

  3. 并发编程之Disruptor并发框架

    一.什么是Disruptor Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JV ...

  4. MySQL Error--存储inode用完后报设备没有空间

    问题描述:磁盘有足够剩余空间,但在创建文件或文件夹时报错,提示“设备没有空间”. 问题原因:当存储设备通过分区格式化为文件系统后,会分为两部分:1.block部分: 存储的最小单位为扇区(Sector ...

  5. docker到底比LXC多了些什么

    看似docker主要的OS级虚拟化操作是借助LXC, AUFS只是锦上添花.那么肯定会有人好奇docker到底比LXC多了些什么.无意中发现 stackoverflow 上正好有人问这个问题, 回答者 ...

  6. LFS7.10——构造临时Linux系统

    参考:LFS编译——准备Host系统 前言 在准备好Host环境后,接下来构造一个临时Linux系统.该系统包含****构建所需要的工具.构造临时Linux系统分两步: 构建一个宿主系统无关的新工具链 ...

  7. Jenkins 插件:Job Configuration History(记录job的历史更新记录)

    1. 添加插件   添加完成后,Jenkins,左下,多一个菜单栏 .可以查看,job的更新记录,见下图 .   如上,End再也不用担心,有同学乱改Job ,却不知道哪里被改的情况了. 注:1)这个 ...

  8. CM的私有仓库搭建

        CM的私有仓库搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们有时候会因为网络不稳定的因素,导致安装某些服务直接失败.当安装包比较大的时候,我们就得考虑自建私有仓库 ...

  9. 2013.6.28 - KDD最后一天

    今天收到中秋的邮件.KDD结果出来了,Zhongqiu Wang & Jingwen Huang 15th/561.  

  10. React系列,jsx

    <script type="text/babel"> var name = "kimoo"; var fn = ()=> "kimo ...