题解 【洛谷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]玩具取名 题目:传送门 简要题意: 就是固定四个字母,给出这四个字母分别可以由哪两个字母组成,然后在给你一个字符串,要求把这个字符串还原成原始的四个字母的其中一个. 题 ...
随机推荐
- [P5665][CSP2019D2T2] 划分
先说说部分分做法吧 1.\(n \leq 10\) 指数级瞎草都可以2333 2.\(n \leq 50\) 好像并没有什么做法-也许给剪枝的人部分分吧 3.\(n \leq 400\) 这个复杂度是 ...
- windows下web端测试环境搭建(tomcat+oracle)
一.安装oracle数据库 1.关闭防火墙.360安全卫士,运行安装程序:Setup.exe,然后下一步...... 2.安装完成后,检查服务是否已启动 3.cmd输入验证登录成功:sqlplus s ...
- python三器
1.1 装饰器 1.装饰器的作用 1. 装饰器作用:本质是函数(装饰其他函数)就是为其他函数添加其他功能 2. 装饰器必须准寻得原则: 1)不能修改被装饰函数的源代码 2)不能修改被装饰函数的调用方式 ...
- RN开发-修改工程名
需要修改如下文件:MainActivity.java , strings.xml , AndroidManifest.xml , build.gradle , package.json 1 packa ...
- GYCTF Node game
考点: NodeJS 代码审计 SSRF 请求夹带 复现: 不太懂js,先留着吧,学懂了再记录
- pip问题:Traceback (most recent call last): File "/usr/bin/pip", line 9, in
源作者blog https://blog.csdn.net/vmxhc1314/article/details/81869676 编辑提示的文件,进行更改即可. 解决方法: 将 /usr/bin/pi ...
- css 基础教程学习
css基础语法 css语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 选择器通常是您需要改变样式的 HTML 元素. 每条声明由一个属性和一个值组成. 如果要定义不止一个声明,则 ...
- java_HashMap的遍历方法_4种
1.通过接收keySet来遍历: HashMap<String,String> map = new HashMap<>(); map.put("bb",&q ...
- springBoot 2.1.5 pom 文件 unknown 错误
插件不兼容 pom文件添加 <properties> <maven-jar-plugin.version>2.6</maven-jar-plugin.version ...
- sql 分组后查询出排序字段
select row_number() over(partition by CODE order by SEQUENCE) as RowIndex from Table 注:根据表的CODE 字 ...