码迷,mamicode.com
首页 > 其他好文 > 详细

【HAOI2008】玩具命名

时间:2017-01-22 19:05:41      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:输出   amp   ++   scanf   getch   set   main   mat   indicator   

水题大失败技术分享

原题:

某人有一套玩具,并想法给玩具命名。首先他选择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 }
View Code

 

【HAOI2008】玩具命名

标签:输出   amp   ++   scanf   getch   set   main   mat   indicator   

原文地址:http://www.cnblogs.com/JSL2018/p/6340995.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!