zoukankan      html  css  js  c++  java
  • 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) && s1和s2可以组成s,那么f[i][j][s]=1;

       O(n^4)...大水题

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 char s[210];
     8 struct node
     9 {
    10     char s1,s2,id;
    11 }st[210];
    12 bool f[210][210][210];
    13 int main()
    14 {
    15     int W,I,N,G;bool bk=false;
    16     scanf("%d%d%d%d",&W,&I,&N,&G);
    17     int len=0;
    18     for(int i=1;i<=W;i++)
    19         scanf("%s",s+1),st[++len].s1=s[1],st[len].s2=s[2],st[len].id='W';
    20     for(int i=1;i<=I;i++)
    21         scanf("%s",s+1),st[++len].s1=s[1],st[len].s2=s[2],st[len].id='I';
    22     for(int i=1;i<=N;i++)
    23         scanf("%s",s+1),st[++len].s1=s[1],st[len].s2=s[2],st[len].id='N';
    24     for(int i=1;i<=G;i++)
    25         scanf("%s",s+1),st[++len].s1=s[1],st[len].s2=s[2],st[len].id='G';
    26     scanf("%s",s+1);
    27     int len1=strlen(s+1);
    28     memset(f,0,sizeof(f));
    29     for(int i=1;i<=len1;i++)f[i][i][s[i]]=true;
    30     for(int i=2;i<=len1;i++)//长度 
    31         for(int l=1;l<=len1-i+1;l++)//左端点 
    32         {
    33             int r=l+i-1;
    34             for(int j=l;j<=r;j++)//断点 
    35                 for(int k=1;k<=len;k++)//枚举所有种类的字符串 
    36                     if(f[l][j][st[k].s1] && f[j+1][r][st[k].s2])
    37                         f[l][r][st[k].id]=true;
    38         }
    39     W='W';I='I';N='N';G='G';
    40     if(f[1][len1][W])printf("W"),bk=true;
    41     if(f[1][len1][I])printf("I"),bk=true;
    42     if(f[1][len1][N])printf("N"),bk=true;
    43     if(f[1][len1][G])printf("G"),bk=true;
    44     if(bk==false)printf("The name is wrong!
    ");
    45     return 0;
    46 }

     

  • 相关阅读:
    Cordova/Cordova.h file not found的解决方法
    使用MethodSwizzle导致按home app进入后台或者app间切换发生crash的解决方法
    基于iOS上MDM技术相关资料整理及汇总
    iOS集成微信支付
    iOS集成支付宝支付
    最新apple邓白氏码申请地址
    游戏的定价
    许久未更,随便侃侃
    记一个有趣的梦
    由《掟上今日子的备忘录》引发的联想
  • 原文地址:https://www.cnblogs.com/CHerish_OI/p/8108886.html
Copyright © 2011-2022 走看看