http://wikioi.com/problem/1018/
又是字符串(10次才过我容易么 = =)
用搜索(数据小)枚举每种情况
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
char s[20+10][200+10];
int vis[20+10];
int con[20+10][20+10];
int ans=0;
void dfs(int i,int l)// 第i个词 当前长度
{
if(l>ans)ans=l;
for(int j=1;j<=n;j++)
{
if(con[i][j]&&vis[j]<2)//最多2次
{
vis[j]++;
dfs(j,l+con[i][j]);
vis[j]--;
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int max=(strlen(s[i]),strlen(s[j]))-1;
for(int l=1;l<=max;l++)//判断能否j在i的后面
{
int ok=1;
for(int k=0;k<l;k++)
{
if(s[i][strlen(s[i])-l+k]!=s[j][k]){
ok=0;
break;
}
}
if(ok)
{
con[i][j]=strlen(s[j])-l;
break;
}
}
}
}
// for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)printf("con[%d][%d]:%d\n",i,j,con[i][j]);
char c[3];
scanf("%s",c);
for(int i=1;i<=n;i++)
if(s[i][0]==c[0])//首字母
{
vis[i]++;
dfs(i,strlen(s[i]));
vis[i]--;
}
printf("%d\n",ans);
// while(1);
return 0;
}
这道题还有一种变形(无首字母条件),貌似要用状压dp 0. 0