BZOJ 1055: [HAOI2008]玩具取名
Fancy
posted @ 2015年7月10日 00:12
in BZOJ
, 420 阅读
题目大意:某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长。现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的。
DP,好多循环。。。
t[a][b][c] ==1 表示ab可以变成c
f[i][j][c]==1 表示从i开始的j个可以变成c
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int w,i,n,g,num,changdu; char name[210],a,b,ch[4]={'W','I','N','G'}; bool t[90][90][90],f[210][210][90]; int main() { scanf("%d%d%d%d",&w,&i,&n,&g); for(int j=1;j<=w;j++) cin>>a>>b,t[a][b]['W']=1; for(int j=1;j<=i;j++) cin>>a>>b,t[a][b]['I']=1; for(int j=1;j<=n;j++) cin>>a>>b,t[a][b]['N']=1; for(int j=1;j<=g;j++) cin>>a>>b,t[a][b]['G']=1; scanf("%s",name+1);changdu=strlen(name+1); for(int i=1;i<=changdu;i++) f[i][1][name[i]]=1; for(int len=2;len<=changdu;len++) for(int l=1;l<=changdu-len+1;l++) for(int k=l;k<=l+len-1;k++) for(int i=0;i<=3;i++) if(f[l][k-l+1][ch[i]]) for(int j=0;j<=3;j++) if(f[k+1][l+len-k-1][ch[j]]) for(int p=0;p<=3;p++) if(t[ch[i]][ch[j]][ch[p]]) f[l][len][ch[p]]=1; for(int i=0;i<=3;i++) if(f[1][changdu][ch[i]]) {num=1;printf("%c",ch[i]);} if(num==0) cout<<"The name is wrong!"; }