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!";
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter