zoukankan      html  css  js  c++  java
  • BZOJ 1055 [HAOI2008]玩具取名 【dp】

    BZOJ 1055  [HAOI2008]玩具取名

    Description

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

    Input

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

    Output

      一行字符串,该名字可能由哪些字母变形而得到。(按照WING的顺序输出)如果给的名字不能由任何一个字母
    变形而得到则输出“The name is wrong!”

    Sample Input

    1 1 1 1
    II
    WW
    WW
    IG
    IIII

    Sample Output

    IN

    HINT

     

    W可以变成II所以IIII可以缩成WW IN均能变成WW所以WW又可以缩成I或者N 所以最终答案应该按照“WING”的顺序

    输出IN 

    [数据范围]

    100%数据满足Len<=200,W、I、N、G<=16
     
     
    题解:
    搜索,但是后来一想可以用区间 Dp。
    设 f[l][r][k]  表示 l 到 r 这段区间能否合成 k 这个字符
    如果 k 这个字符能由 a,b 这两个字符合成,那么 f[l][r][k]= f[l][j][a] && f[j+1][r][b]  (l<=j<=r)
    别的什么不用多说了,就注意一定要记忆化,否则会T掉(快读什么的大可不需要)。
     
    代码:
     
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 //int a,b,c,d;
     4 char p[4]={'W','I','N','G'};
     5 int q[255],t[4];
     6 char ch[205],a[4][20][2];
     7 int f[205][205][4];
     8 inline int read()
     9 {
    10     int x=0,f=1; char ch=getchar();
    11     while (!isdigit(ch)) f=(ch=='-')?-f:f,ch=getchar();
    12     while (isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    13     return x*f;
    14 }
    15 bool dp(int l,int r,int k)
    16 {
    17     if (l==r) return (ch[l]==p[k]);
    18     int &result=f[l][r][k];
    19     if (result!=-1) return result;
    20     for (int i=1; i<=t[k]; i++)
    21       for (int j=l; j<=r-1; j++)
    22         if (dp(l,j,q[a[k][i][0]]) && dp(j+1,r,q[a[k][i][1]]))
    23           return result=1;
    24     return result=0;
    25 }
    26 int main()
    27 {
    28     //scanf("%d%d%d%d",&a,&b,&c,&d);
    29     memset(f,-1,sizeof(f));
    30     q['W']=0; q['I']=1; q['N']=2; q['G']=3;
    31     for (int i=0; i<4; i++) t[i]=read();
    32     for (int i=0; i<4; i++)
    33       for (int j=1; j<=t[i]; j++)
    34         scanf("%s",a[i][j]);
    35     scanf("%s",ch+1);
    36     int n=strlen(ch+1);
    37     bool bj=false;
    38     for (int i=0; i<4; i++)
    39       if (dp(1,n,i)) bj=true,printf("%c",p[i]);
    40     if (!bj) puts("The name is wrong!");
    41     return 0;
    42 }
    View Code

    加油加油加油!!!fighting fighting fighting!!!

  • 相关阅读:
    Microsoft Prerelease Software Visual Studio Code Name "Orcas" January 2007 Community Technology Preview (CTP)
    Attribute Example In MSDN
    AutoEventWireup 20032005
    转ASP.NET中常用的优化性能方法
    转 用whitespace:nowrap;解决中文标签标签换行问题
    RBAC 模型初探[转]
    .net开源相关
    Path.GetExtension 方法
    应用程序注释规范
    Web.config的写入操作
  • 原文地址:https://www.cnblogs.com/Frank-King/p/9402286.html
Copyright © 2011-2022 走看看