bzoj 1055: [HAOI2008]玩具取名(字符串dp)
2016-10-13 18:37
288 查看
1055: [HAOI2008]玩具取名
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1586 Solved: 923
[Submit][Status][Discuss]
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 1II
WW
WW
IG
IIII
Sample Output
INHINT
W可以变成II所以IIII可以缩成WW IN均能变成WW所以WW又可以缩成I或者N 所以最终答案应该按照“WING”的顺序输出IN
[数据范围]
100%数据满足Len<=200,W、I、N、G<=16
Source
[Submit][Status][Discuss]
题解:字符串dp
f[i][j][k]表示区间[i,j]能否合并成字符k
直接枚举区间断点和合并规则即可进行dp。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define N 203 using namespace std; int f [10],num ; int c[10] [3],a ; char s ; int calc(char c) { if (c=='W') return 1; if (c=='I') return 2; if (c=='N') return 3; if (c=='G') return 4; } int main() { for (int i=1;i<=4;i++) scanf("%d",&num[i]); for (int i=1;i<=4;i++) { for (int j=1;j<=num[i];j++) { scanf("%s",s+1); for (int k=1;k<=2;k++) c[i][j][k]=calc(s[k]); } } scanf("%s",s+1); int n=strlen(s+1); for (int i=1;i<=n;i++) a[i]=calc(s[i]); for (int i=1;i<=n;i++) f[i][i][a[i]]=1; for (int i=n;i>=1;i--) for (int j=i+1;j<=n;j++) { for (int k=1;k<=4;k++) for (int l=1;l<=num[k];l++) if (c[k][l][1]==a[i]&&f[i+1][j][c[k][l][2]]) f[i][j][k]=1; for (int t=i+1;t<=j;t++) for (int k=1;k<=4;k++) { if (f[i][j][k]) continue; for(int l=1;l<=num[k];l++) { f[i][j][k]=f[i][t-1][c[k][l][1]]&f[t][j][c[k][l][2]]; if (f[i][j][k]) break; } } } bool pd=false; for (int i=1;i<=4;i++) if (f[1] [i]) { pd=true; if (i==1) printf("W"); if (i==2) printf("I"); if (i==3) printf("N"); if (i==4) printf("G"); } if (!pd) printf("The name is wrong!\n"); }
相关文章推荐
- 【bzoj 1055】[HAOI2008]玩具取名(字符串dp)
- 【bzoj1055】【区间DP 记忆化搜索】[HAOI2008]玩具取名 把所给的字符串缩成WING这四个字符之一
- bzoj 1055 [HAOI2008]玩具取名(区间DP)
- bzoj1055 [HAOI2008]玩具取名[区间DP]
- bzoj 1055: [HAOI2008]玩具取名(区间DP)
- bzoj1055: [HAOI2008]玩具取名 dp
- [bzoj1055][HAOI2008]玩具取名_区间dp
- [BZOJ1055][HAOI2008]玩具取名 区间dp
- [BZOJ1055][HAOI2008]玩具取名(dp)
- [BZOJ 1055][HAOI2008]玩具取名(DP)
- BZOJ 1055 [HAOI2008]玩具取名 DP
- [BZOJ]1055: [HAOI2008]玩具取名 DP
- bzoj 1055: [HAOI2008]玩具取名 dp
- bzoj1055[HAOI2008]玩具取名 (区间dp)
- 【BZOJ 1055】[HAOI2008]玩具取名 bool型dp
- [bzoj1055][HAOI2008]玩具取名(区间dp)
- bzoj 1055 [HAOI2008]玩具取名(区间DP)
- bzoj1055[HAOI2008]玩具取名 区间dp
- 【BZOJ1055】[HAOI2008]玩具取名【区间DP】【状压】
- 【BZOJ 1055】【HAOI 2008】玩具取名 【区间DP】