题目大意:有WING四个字母,每个字母可以用WING中若干组连续两个字母替代,给你一个字符串,求它可以还原成WING中哪几个字母
题解: f[l][r][c] 表示 [l,r] 能否合成字母c,直接枚举断点转移即可
我的收获:naive
#include <bits/stdc++.h>
using namespace std;
const int N=255;
char p[4]={'W','I','N','G'};
int n,q[N],t[4];
char str[N],a[4][20][2];
int f[N][N][4];
bool dp(int l,int r,int c)
{
if(l==r) return str[l]==p[c];
if(f[l][r][c]!=-1) return f[l][r][c];
for(int i=1;i<=t[c];i++)
for(int k=l;k<r;k++)
if(dp(l,k,q[a[c][i][0]])&&dp(k+1,r,q[a[c][i][1]]))
return f[l][r][c]=1;
return f[l][r][c]=0;
}
void work()
{
memset(f,-1,sizeof(f));
bool flag=0;
for(int i=0;i<4;i++)
if(dp(1,n,i)) flag=1,printf("%c",p[i]);
if(!flag) puts("The name is wrong!");
}
void init()
{
q['W']=0;q['I']=1;q['N']=2;q['G']=3;
for(int i=0;i<4;i++) scanf("%d",&t[i]);
for(int i=0;i<4;i++) for(int j=1;j<=t[i];j++) scanf("%s",a[i][j]);
scanf("%s",str+1);n=strlen(str+1);
}
int main()
{
init();
work();
return 0;
}