题解 【洛谷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]玩具取名 题目:传送门 简要题意: 就是固定四个字母,给出这四个字母分别可以由哪两个字母组成,然后在给你一个字符串,要求把这个字符串还原成原始的四个字母的其中一个. 题 ...
随机推荐
- Java代码中特殊注释
Java代码中特殊注释 TODO: + 说明:标识处有功能代码待编写,待实现的功能在说明中会简略说明. FIXME: + 说明:标识处代码需要修正,甚至代码是错误的,不能工作,需要修复,如何修正会在说 ...
- 关于f(x)
有时 z = x + y 有时 0 = x + y 有时单独用f(x) 有时 z = f(x) 很容易分不清. 从集合角度,将f(x)看成映射 即从A集合到B集合的对应关系 这样f(x)可以单独使用, ...
- 最简单的githut操作命令
创建SSH Key: 参考:https://blog.csdn.net/weixin_30345055/article/details/95139358 在用户目录下,看看有没有.ssh文件夹,如果有 ...
- 5G PDCCH 协议
For downlink, a maximum of 16 HARQ processes per cell is supported by the UE. The number of processe ...
- mysql 视图、触发器、事务、存储过程、函数
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- 使用U盘装Windows10系统
一.装备工作 使用U盘装系统需要准备以下工具: 8G左右的U盘一个.由于制作启动盘会删除U盘的所有数据,所以重要资料请提前备份. 系统的镜像文件.这里我推荐MSDN, 我告诉你.这里下载的镜像和官方的 ...
- spring框架中用到了哪些设计模式
1.代理模式:在AOP和remoting中被用的比较多 2.单例模式:在spring配置文件中定义的bean默认为单例模式 3.模板方法模式:解决代码重复问题 4.前端控制器模式:spring提供了D ...
- Python爬虫连载4-Error模块、Useragent详解
一.error 1.URLError产生的原因:(1)没有网络:(2)服务器连接失败:(3)不知道指定服务器:(4)是OSError的子类 from urllib import request,err ...
- python中可变类型和不可变类型数据的复制
常见的复制方式有以下5种第1种:通过等号[=]复制 - 不论可变还是不可变数据类型,通过[=]复制后都指向同一个内存地址: - 改变复制后的数据(例子中的anotherStr,anotherList) ...
- layer iframe 设置关闭按钮 和刷新
layer.open({ type: 2, title: 'XXXX网吧历史更多数据', shade:0, // closeBtn:0, resize:false, move:false, shade ...