zoukankan      html  css  js  c++  java
  • 【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 }
    View Code
  • 相关阅读:
    POJ 3140 Contestants Division (树形DP,简单)
    POJ 2378 Tree Cutting (树的重心,微变形)
    js数据类型--对象&数组
    关于JS call apply 对象、对象实例、prototype、Constructor、__proto__
    JS模块化编程(四)--require应用
    JS模块化编程(三)
    利用VS正则替换删除文本行首数据等字符
    JS模块化编程(二)
    JS模块化编程(一)
    js继承
  • 原文地址:https://www.cnblogs.com/JSL2018/p/6340995.html
Copyright © 2011-2022 走看看