题解 【洛谷P4290】 [HAOI2008]玩具取名
这道题很明显是区间DP。
为了方便表示,我们可以将‘W’、‘I’、‘N’、‘G’分别设为1、2、3、4。
另外,DP可能有点丑,记忆化搜索可能写起来更容易理解。
AC代码:
#include <bits/stdc++.h>
using namespace std;//使用标准名字空间
inline int read()//快速读入
{
int f=1,x=0;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0' && c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return f*x;
}
string s;
int b[5][5][5],dp[210][210][5],p[130],d[5],len,fl;//定义变量
int main()
{
p['W']=1,p['I']=2,p['N']=3,p['G']=4;//将字母表示成数字
for(register int i=1; i<=4; i++)//输入
{
d[i]=read();
}
for(register int i=1; i<=4; i++)
{
for(register int j=1; j<=d[i]; j++)
{
cin>>s;//输入每个字母可以代表的子字符串
b[p[s[0]]][p[s[1]]][i]=1;//标记这个字符串由i演变而来
}
}
cin>>s;//输入玩具名称
len=s.size();//记录名称长度
for(register int i=0; i<len; i++)
{
dp[i][i][p[s[i]]]=1;//标记第i个位置
}
//开始DP主过程
for(register int i=len-1; i>=0; i--)
{
for(register int j=i+1; j<len; j++)//枚举区间(i,j)
{
for(register int k=1; k<5; k++)//枚举字母
{
for(register int l=1; l<5 && dp[i][j][k]==0; l++)//如果(i,j)不含有字母k,就枚举字母l
{
for(register int o=1; o<5 && dp[i][j][k]==0; o++)//同理
{
if(b[l][o][k]==0)//如果字母组合(l,o)不能由字母k演变来
{
continue;//就继续循环
}
for(register int w=i; w<j && dp[i][j][k]==0; w++)
{
dp[i][j][k]|=(dp[i][w][l] & dp[w+1][j][o]);//主要DP步骤,要仔细体会
}
}
}
}
}
}
//输出
if(dp[0][len-1][1])
{
cout<<'W';
fl=1;
}
if(dp[0][len-1][2])
{
cout<<'I';
fl=1;
}
if(dp[0][len-1][3])
{
cout<<'N';
fl=1;
}
if(dp[0][len-1][4])
{
cout<<'G';
fl=1;
}
//无解输出
if(fl==0)
{
cout<<"The name is wrong!";
}
return 0;//完美结束
}
题解 【洛谷P4290】 [HAOI2008]玩具取名的更多相关文章
- 洛谷 P4290 [HAOI2008]玩具取名
传送门 思路 博客半年没更新了,来更新个博文吧 在\(dsr\)聚聚博客的帮助下,我用半个上午和一个中午的时间苟延残喘地完成了这道题 先是读题目读大半天,最后连个样例都看不懂 之后又是想思路,实在想不 ...
- 洛谷 4290 [HAOI2008]玩具取名 题解
P4290 [HAOI2008]玩具取名 题目描述 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用&qu ...
- bzoj1055 ||P4290 [HAOI2008]玩具取名
目录 链接 思路 代码 链接 luogu bzoj 思路 区间dp 然后\(f[i][j][k]\) 区间\([i,j]\)能否变成\(k\)字符 (字符当然得转化一下) 字符的个数不多,直接暴力\( ...
- P4290 [HAOI2008]玩具取名
传送门 $dp$ 设 $f[i][j][k]$ 表示初始为 $k$ 时,能否得到 $[i,j]$ 这一段子串 设 $pd[i][j][k]$ 表示长度为二的字符串 $ij$ 能否由 $k$ 得到 然后 ...
- DP【洛谷P4290】 [HAOI2008]玩具取名
P4290 [HAOI2008]玩具取名 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用"WI ...
- 【BZOJ1055】[HAOI2008]玩具取名(动态规划)
[BZOJ1055][HAOI2008]玩具取名(动态规划) 题面 BZOJ 洛谷 题解 裸的区间\(dp\),设\(f[i][j][W/I/N/G]\)表示区间\([i,j]\)能否由某个字母替换过 ...
- BZOJ 1055 [HAOI2008]玩具取名
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1119 Solved: 653[Submit][Statu ...
- 【BZOJ1055】[HAOI2008]玩具取名(区间DP)
[HAOI2008]玩具取名 题目描述 某人有一套玩具,并想法给玩具命名.首先他选择\(WING\)四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用" ...
- 【bzoj1055】[HAOI2008]玩具取名
[bzoj1055][HAOI2008]玩具取名 2014年12月1日3,0111 Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名 ...
- bzoj1055: [HAOI2008]玩具取名(dp)
1055: [HAOI2008]玩具取名 题目:传送门 简要题意: 就是固定四个字母,给出这四个字母分别可以由哪两个字母组成,然后在给你一个字符串,要求把这个字符串还原成原始的四个字母的其中一个. 题 ...
随机推荐
- 08-SV面向对象编程的高级技巧指南
1.原始类与扩展类 (1)原始类被称为父类或者超类,扩展类被称为派生类或者子类.扩展类可以直接访问原始类和其本身的所有变量,应该将原始类中的子程序定义成虚拟的,这样它们就可以在扩展类中重定义.new函 ...
- ASP.NET常用内置对象(二)Response
response翻译为中文:响应. 将数据作为请求的结果从服务器发送到客户浏览器中,并提供有关响应的消息.它可用来在页面中输出数据,在页面中跳转,还可以传递各个页面的参数. Response对象是Sy ...
- First Kernel-pwn
Kernel pwn-极简题目的操作模式 完全参照M4x师傅的指导,用 hacklu的baby kernel迈了第一步 题目附带文件说明 一般题目会给出bzImage,.cpio, .sh文件 sh文 ...
- HTML连载64-a标签伪类选择器的注意点与练习
一.a标签的伪类选择器注意点 (1)a标签的伪类选择器可以单独出现,也可以一起出现.也就是可以设置多个状态的样式. (2) a标签的伪类选择器如果一起出现,那么有严格的顺序要求,编写的顺序必须要遵守原 ...
- [Python]BeautifulSoup安装与使用
1.BeautifulSoup简介 BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据 ...
- Python入门10 —— for循环
1.字符串依次取值 students = ['egon', 'lxx', 'alex'] i = 0 while i < 3: print(students[i]) i += 1 2.针对循环取 ...
- requests-验证码登录
ModuleNotFoundError: No module named 'bs4': 解决方法:pip install beautifulsoup4 https://blog.csdn.net/wi ...
- ActiveMQ使用JDBC持久化
步骤一:创建一个数据库 步骤二:配置activemq.xml配置文件 1.在persistenceAdapter加入如下配置 <!--crea ...
- 获取table中CheckBox选中行的id
方式一 var selectList=''; jQuery(".table tbody input[type=checkbox]:checked").map(function () ...
- glog入门demo
glog 一. 下载与安装 git clone https://github.com/google/glog.git cd glog ./autogen.sh ./configure make mak ...