本文主要是介绍【bzoj 1055】[HAOI2008]玩具取名(字符串dp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1055: [HAOI2008]玩具取名
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1590 Solved: 927
[ Submit][ Status][ Discuss]
Description
Input
Output
Sample Input
II
WW
WW
IG
IIII
Sample Output
HINT
Source
【题解】【字符串dp】
[其实很简单,特别是在做过祖先那道题后]
【用数组list记录匹配信息,list[i][0]表示更改后的字母(本题中用数字1,2,3,4代替即可),list[i][1]和list[i][2]分别表示更改前的第1位和第二位】
【用数组f[i][j][1/2/3/4]表示从第i位到第j位能否更改为1/2/3/4代表的字母】
【转移:f[i][j][list[l][0]]=1(f[i][k][list[l][1]]==1,f[k+1][j][list[l][2]]==1)】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[210];
int num[5],list[210][3],tot,f[210][210][5],len;
inline int check(char i)
{if(i=='W') return 1;if(i=='I') return 2;if(i=='N') return 3;if(i=='G') return 4;
}
int main()
{int i,j;for(i=1;i<=4;++i) scanf("%d\n",&num[i]);for(i=1;i<=4;++i){for(j=1;j<=num[i];++j){char ss[5];scanf("%s",ss);list[++tot][0]=i; list[tot][1]=check(ss[0]); list[tot][2]=check(ss[1]);}getchar();}gets(s+1); len=strlen(s+1);for(i=1;i<=len;++i) f[i][i][check(s[i])]=1;for(i=len;i>0;--i)for(j=i+1;j<=len;++j)for(int k=i;k<j;++k)for(int l=1;l<=tot;++l)if(f[i][k][list[l][1]]&&f[k+1][j][list[l][2]]) f[i][j][list[l][0]]=1;bool p=0;for(i=1;i<=4;++i)if(f[1][len][i]){p=1;if(i==1) printf("W");if(i==2) printf("I");if(i==3) printf("N");if(i==4) printf("G");}if(!p) printf("The name is wrong!\n");return 0;
}
这篇关于【bzoj 1055】[HAOI2008]玩具取名(字符串dp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!