玩具起名~~
题目不复制了~~
dp~
dp【i】【j】【k】表示 第i个到第j个区间可不可以用k来表示
一开始没有注意到 可以由一个字母转化过来蒙圈了许久。╮(╯_╰)╭
注意需要加一个记忆化搜索,,,这个加的我好心累、
时间优化还是挺明显的orz
下面是代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
//by mars_ch
using namespace std;
int n[5];
char c[5][21][5];
char s[205];
int dp[205][205][5];
char m[5]={'W','I','N','G'};
int hash(char c)
{
if(c == 'W') return 0;
if(c == 'I') return 1;
if(c == 'N') return 2;
if(c == 'G') return 3;
}
bool dfs(int l,int r,int k)
{
if(l == r) return (s[l] == m[k]);
if(dp[l][r][k] != -1) return dp[l][r][k];
for(int i=0;i<n[k];i++)
{
for(int j=l;j<r;j++)
{
if(dfs(l,j,hash(c[k][i][0])) && dfs(j+1,r,hash(c[k][i][1])))
{
dp[l][r][k]=1;
return true;
}
}
}
dp[l][r][k]=0;
return false;
}
int main()
{
memset(dp,-1,sizeof(dp));
for(int i=0;i<4;i++)
{
scanf("%d",&n[i]);
}
for(int i=0;i<4;i++)
{
for(int j=0;j<n[i];j++)
{
scanf("%s",c[i][j]);
}
}
scanf("%s",s);
int len=strlen(s);
int flag=0;
for(int i=0;i<4;i++)
{
if(dfs(0,len-1,i)) flag=1,printf("%c",m[i]); //注意是len-1
}
if(flag == 0) printf("The name is wrong!\n");
return 0;
}