题意:如果字符串a的最后一个字符等于字符串b的第一个字符,那么,a,b是可连接的。又假设在一个字符串的链条中如果第一个字符串的第一个字符等于最后一个字符串的最后一个字符,这个链条是符合题意的。求长度最长的链条。
做法:这个是图论还是DP。把每个字符串压缩一下,如abcde压缩到矩阵中变成mat[a][e]=strlen("abcde").最后利用图论 的手法求出最长链。值得注意的是,这里会有回路,所以要每加入一个字符串计算一次。
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int mat[30][30];
char name[15];
//压缩的思想
//这个明明就是图论...
//为了防止遇到回路现象,每输入一个单词测试一次。
int main()
{
int i,u,v,l,n,ans=-1;
scanf("%d",&n);
while(n--)
{
scanf("%s",name);
l=strlen(name);
u=name[0]-'a';v=name[l-1]-'a';
for(i=0;i<26;i++)
if(mat[i][u]&&mat[i][u]+l>mat[i][v])
mat[i][v]=mat[i][u]+l;
if(mat[u][v]<l)mat[u][v]=l;
}
for(i=0;i<26;i++)
if(ans<mat[i][i])
ans=mat[i][i];
printf("%d\n",ans);
return 0;
}