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!\n");
45     return 0;
46 }
时间: 2024-10-10 04:58:44

bzoj1055: [HAOI2008]玩具取名(dp)的相关文章

BZOJ1055: [HAOI2008]玩具取名

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

[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】玩具取名 区间DP

1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1560  Solved: 907[Submit][Status][Discuss] 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..

[HAOI2008] 玩具取名 - 区间dp

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

[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]玩具取名 区间dp

题面 题目传送门 解法 直接区间dp即可 时间复杂度:\(O(16n^3)\) 代码 #include <bits/stdc++.h> #define N 210 using namespace std; struct Node { int x, y; } a[5][N]; int s[5], p[5][5][5]; bool f[N][N][5], vis[N][N][5]; int num(char ch) { if (ch == 'W') return 1; if (ch == 'I')