//↓满分DFS
void dfs(int a){
qn[a]=1;
for(int i=1;i<=n;i++){
if(nn[a][nn[a].length()-1]==nn[i][0]&&qn[i]==0){
if(ans[a]+nn[i].length()>ans[i]){
ans[i]=ans[a]+nn[i].length();
dfs(i);
qn[i]=0;
}
}
}
}
/*
qn数组标记当前传进来的第a位字符串,已被使用
遍历1-n,按照题意nn[a][nn[a].length()-1]==nn[i][0],而且第i位字符串没有被使用过
进入第二个if,如果当前传进来的第a位(第a位字符串的长度)加上遍历的第i位的字符串长度,大于第i位ans数组中的数字(ans除了一开始传进去的第一个a,其他都为0),进入
ans[i]=ans[a]+nn[i].length();
从第i位继续搜索,即现在字符串最后的一个字母变成了第i位字符串的最后一位,此时ans数组中的第i位装着,目前为止拼接了的字符串的最大长度
最后回溯
*/
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)cin >> nn[i];//读入数据
for(int i=1;i<=n;i++){
ans[i]=nn[i].length();//每一次循环,ans数组都清,并将第i位初始化为第i位字符串的长度
dfs(i);//第i位为起点,dfs
for(int j=1;j<=n;j++)com=max(ans[j],com);//在已经在dfs中赋值好的ans数组中寻找最大值
memset(qn,0,sizeof(qn));
memset(ans,0,sizeof(ans));
//将ans和qn两个数组清空,方便下一个位置的字符串作为开头,搜索使用
//for(int j=0;j<20;j++)printf("%d ",qn[j]);
}
printf("%d",com);//输出结果
return 0;
}
P1278 单词游戏
2019-05-10