我刚开始没思路,后来看了第二篇题解,并且跟着他的代码改了半天,却只有十分,后来我把他的代码粘到本地运行了一下,结果字符串c没有定义,我又给他定义上,并且跑了一遍我自己编的这组数据:
1 2 1 1
II
WW NN
GG
NN
WWIINNGG
结果输出却是:
The name is wrong!
我寻思这也没看出来哪错了啊? 望大佬予以解答,顺便贴上我的代码;
#include<bits/stdc++.h>
using namespace std;
int main()
{
int q[200],sum[5],can[5][5][5],dp[210][210][5],name[210];//can[i][j][k]i和j组合的表示可以转换为k
string a,qwq="+WING";//dp[i][j][k]表示区间[i,j]可以转换k
char s1,s2;
q['W']=1;//建立映射
q['I']=2;
q['N']=3;
q['G']=4;
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//读入数据并转换:
for(int i=1;i<=4;i++)
cin>>sum[i];
for(int i=1;i<=4;i++)
for(int j=1;j<=sum[i];j++)
{
cin>>s1>>s2;
can[i][q[s1]][q[s2]]=1;
}
cin>>a;
int n=a.size();
for(int i=1;i<=n;i++) dp[i][i][q[a[i-1]]]=1;
/*for(int i=1;i<=n;i++)
name[i]=q[(int)a[i]];
for(int i=1;i<=4;i++)
{
for(int j=1;j<=sum[i];j++)
{
for(int k=1;k<=2;k++)
cout<<can[i][j][k];
cout<<endl;
}
cout<<endl;
}
*/
//开始dp
for(int len=1;len<n;len++)
for(int i=1;i<=n-len;i++)
{
int j=i+len;
for(int k=i;k<j;k++)
for(int t=1;t<=4;t++)
for(int z1=1;z1<=4;z1++)
for(int z2=1;z2<=4;z2++)
if(can[t][z1][z2]&&dp[i][k][z1]&&dp[k+1][j][z2])
dp[i][j][t]=1;
}
/*cout<<n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=4;k++)
cout<<dp[i][j][k];
cout<<endl;
}
cout<<endl;
}*/
int ff=0;
for(int i=1;i<=4;i++)
if(dp[1][n][i])
{
cout<<qwq[i];
ff=1;
}
if(!ff) cout<<"The name is wrong!";
return 0;
}
/*1 2 1 1
II
WW NN
GG
NN
WWIINNGG*/