【HAOI2008】玩具命名

水题大失败

原题:

某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长。
现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的。

第一行四个整数W、I、N、G。表示每一个字母能由几种两个字母所替代。
接下来W行,每行两个字母,表示W可以用这两个字母替代。
接下来I行,每行两个字母,表示I可以用这两个字母替代。
接下来N行,每行两个字母,表示N可以用这两个字母替代。
接下来G行,每行两个字母,表示G可以用这两个字母替代。
最后一行一个长度不超过Len的字符串。表示这个玩具的名字

如果给的名字不能由任何一个字母变形而得到则输出“The name is wrong!”

Len<=200,W、I、N、G<=16

因为之前水了几道HAOI的题,所以这次想了想直接开始码dfs,然后呵呵

然后上网搜题解了……

然后发现是区间DP,然后就又很水了……

用f[i][j][k]表示从i到j可以变成k

区间DP即可

注意无解

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int mf[210];  char _f[5];
 8 int b[5];  bool a[5][5][5];
 9 int t[210],lt=0;  char _t[210];
10 bool f[5][210][210];
11 int main(){//freopen("ddd.in","r",stdin);
12     memset(f,0,sizeof(f));
13     memset(a,0,sizeof(a));
14     mf[‘W‘]=1,mf[‘I‘]=2,mf[‘N‘]=3,mf[‘G‘]=4;
15     for(int i=1;i<=4;i++)  cin>>b[i];
16     for(int k=1;k<=4;k++)
17         for(int i=1;i<=b[k];i++){
18             char _ch=getchar();  while(_ch!=‘W‘&&_ch!=‘I‘&&_ch!=‘N‘&&_ch!=‘G‘)_ch=getchar();
19             a[k][mf[_ch]][mf[getchar()]]=true;
20         }
21     scanf("%s",_t+1);  lt=strlen(_t+1);
22     for(int i=1;i<=lt;i++){  t[i]=mf[_t[i]];  f[t[i]][i][i]=true;}
23     /*for(int i=1;i<lt;i++)
24         for(int j=1;j<=4;j++)
25             f[j][i][i+1]=a[j][t[i]][t[i+1]];*/
26     for(int l=2;l<=lt;l++)
27         for(int i=1;i<=lt-l+1;i++){
28             int j=i+l-1;
29             for(int h=i;h<=j-1;h++)
30                 for(int p=1;p<=4;p++)if(f[p][i][h])
31                     for(int q=1;q<=4;q++)if(f[q][h+1][j])
32                         for(int k=1;k<=4;k++)if(a[k][p][q])
33                             f[k][i][j]=true;
34         }
35     _f[1]=‘W‘,_f[2]=‘I‘,_f[3]=‘N‘,_f[4]=‘G‘;
36     bool flag=false;
37     for(int i=1;i<=4;i++)if(f[i][1][lt])  cout<<_f[i],flag=true;
38     if(!flag)  cout<<"The name is wrong!"<<endl;
39     cout<<endl;
40     return 0;
41 }

时间: 2024-08-03 15:30:26

【HAOI2008】玩具命名的相关文章

BZOJ1055: [HAOI2008]玩具取名

1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 820  Solved: 482[Submit][Status] Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长.现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的

bzoj 1055 [HAOI2008]玩具取名(区间DP)

1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1258  Solved: 729[Submit][Status][Discuss] Description 某 人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用 “WING”中任意两个字母代替,使得自己的名字能够扩充得很长.现在,他想请你猜猜某一个很长的名字,最初可能

BZOJ 1055 [HAOI2008]玩具取名

1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1119  Solved: 653[Submit][Status][Discuss] Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长.现在,他想请你猜猜某一个很长的名字,最初可能是由

【BZOJ】1055: [HAOI2008]玩具取名(dp)

http://www.lydsy.com/JudgeOnline/problem.php?id=1055 我竟然都没往dp这个方向想.....百度了下看到标题是dp马上就会转移了QAQ... 设d[i,j,k]表示i~j是否能转移成k. 那么很显然.. d[i,j,k]=d[i,k,x]&&d[k+1,j,y]&&a[k,x,y],a[k,x,y]表示k能转移到xy. 然后我数组小了re..(我都开了202啦........... 然后没有判误解wa了......太sb..

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

1055: [HAOI2008]玩具取名 题目:传送门 简要题意: 就是固定四个字母,给出这四个字母分别可以由哪两个字母组成,然后在给你一个字符串,要求把这个字符串还原成原始的四个字母的其中一个. 题解: 一开始看题有点瞎...想了想是一道超级大难题... 其实就是一个很简单的DP... 定义发f[i][j][s]:表示在字符串中i~j这个区间是否可以组合成为字符s 转移很容易就可以想出来:因为如果f[i][k][s1]==f[k+1][j][s2]==1(i<=k<=j) &&

[HAOI2008] 玩具取名 - 区间dp

某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用"WING"中任意两个字母代替,使得自己的名字能够扩充得很长.现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的.\(n \leq 200\) Solution 老生常谈的区间 dp 设 \(f[i][j][k]\) 表示能否将 \([i,j]\) 压成 \(k\) 这个字母,\(g[i][j][k]\) 表示 \(i,j\)

[bzoj1055][HAOI2008]玩具取名_区间dp

玩具取名 bzoj-1055 HAOI-2008 题目大意:给你一个用W,I,N,G组成的字符串,给你一些这四个字符之间的变换规则,每一个变换规则都是由一个字符变成两个字符,问这个字符串是否可能是由一个单独的字符变成的. 注释:$1\le Len\le 200$,每种字符的变换规则<=16 想法:刚看见题以为又是什么单词接龙之类的题,然后看了一眼数据范围... ...还是不会. 查了题解,发现是一个挺不常见的bool区间dp 状态:dp[i][j][c]表示[i,j]这段区间是否能变成c字符,c

[BZOJ 1055][HAOI2008]玩具取名(DP)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1055 分析: 比较难想的dp f[i][j][c]表示i..j能否压缩成字符c 那么怎么转移呢 如果存在i<=k<j,f[i][k][c1]=true且f[k+1][j][c2]=true且c1c2可以压缩成字符c(这个根据读入判断),那么f[i][j][c]就是true. 记忆化搜索比较好实现了.

BZOJ 1055 HAOI2008 玩具取名 动态规划

题目大意:给定一个由'W','I','N','G'构成的字符串,给定一些规则,这些规则可以将两个字符合成为一个,例如"II"可以合成为'W',"WW"可以合成为'I'或者'N' 求这个字符串可以最终合成为哪几种字符 看到这题我想到了广搜...其实没必要,动归完全可以解决 令f[i][j][k]为从i开始的j个字符是否可以合成为字符[k] 然后j从外层循环,剩下的全部预处理,怎么暴力怎么转移,我写了六层循环,有点吓人 #include<cstdio> #i