#include <iostream>
#include <cstring>
using namespace std;
int n,num[21],ans,lj[21][21],book[21];
string a[21];
char start;
void dfs(int step,int sum)
{
int i,j,stepl=a[step].length();
sum+=stepl;
if(ans<sum) ans=sum;
book[step]++;
for(i=0;i<n;i++)
{
if(book[i]==2||lj[step][i]==0) continue;
dfs(i,sum-lj[step][i]);
}
book[step]--;
return;
}
int main()
{
int i,j,k,q;
bool tmp=1;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
cin>>start;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
int il=a[i].length(),jl=a[j].length();
for(k=0;k<il;k++)
{
for(q=0;q<=k;q++)
{
if(q==jl-1)
{
tmp=0;
break;
}
if(a[i][il-k+q-1]!=a[j][q])
{
tmp=0;
break;
}
}
if(tmp==1)
{
lj[i][j]=k+1;
tmp=1;
break;
}
tmp=1;
}
}
}
for(i=0;i<n;i++)
{
if(a[i][0]==start) dfs(i,0);
}
cout<<ans;
return 0;
}
如上是我的AC代码。 下面是之前的68分,1,2点错误的代码。
#include <iostream>
#include <cstring>
using namespace std;
int n,num[21],ans,lj[21][21],book[21];
string a[21];
char start;
void dfs(int step,int sum)
{
int i,j,stepl=a[step].length();
sum+=stepl;
if(ans<sum) ans=sum;
book[step]++;
for(i=0;i<n;i++)
{
if(i==step||book[i]==2||lj[step][i]==0) continue;
dfs(i,sum-lj[step][i]);
}
book[step]--;
return;
}
int main()
{
int i,j,k,q;
bool tmp=1;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
cin>>start;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j) continue;
int il=a[i].length(),jl=a[j].length();
for(k=0;k<il;k++)
{
for(q=0;q<=k;q++)
{
if(q==jl-1)
{
tmp=0;
break;
}
if(a[i][il-k+q-1]!=a[j][q])
{
tmp=0;
break;
}
}
if(tmp==1)
{
lj[i][j]=k+1;
tmp=1;
break;
}
tmp=1;
}
}
}
for(i=0;i<n;i++)
{
if(a[i][0]==start) dfs(i,0);
}
cout<<ans;
return 0;
}
中间的区别在于,68分代码预设不能从原先在的单词接上原来的单词。假设龙头字母为E,只有一个ENVELOPE单词,正确答案为15,错误答案为8,因为可以从ENVELOPE再接回,变成ENVELOPENVELOPE。