QAQ
标签是记忆化搜索
我居然第一下想到的是状压DP?
先给出状压的解法
令DP[i][j]是状态i下最后一个单词是j是否可行
转移方程 dp[i][j|(1<< k-1)]=dp[i][j](前提是满足要求)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
bool dp[1<<17][17];
char w[101],t[101],len[101];//w[i]记录i单词的开头字母,t[i]记录i单词结尾字母
char s[200];
int main()
{
int n;
scanf("%d\n",&n);
for(int i=1;i<=n;i++)
scanf("%s",(s+1)),w[i]=s[1],t[i]=s[strlen(s+1)],len[i]=strlen(s+1);
for(int i=1;i<=n;i++)
dp[1<<i-1][i]=1;//状态初始化
dp[0][0]=1;
for(int i=0;i<1<<n;i++)//枚举基础状态
for(int j=1;j<=n;j++)//枚举最后一个单词
if(dp[i][j])//前提状态为真
{
for(int k=1;k<=n;k++)
if(((1<<k-1)&i)==0&&j!=k)//在i状态中不存在单词K
if(t[j]==w[k]) dp[i|(1<<k-1)][k]=1;//满足条件,转移OK!
}
int ans=0;
for(int i=0;i<1<<n;i++)
for(int j=1;j<=n;j++)
if(dp[i][j])
{
int num=0;
for(int k=1;k<=n;k++)
if(i&(1<<k-1)) num+=len[k];//暴力统计长度
//puts("");
ans=max(ans,num); //得到最大长度
}
printf("%d",ans);
return 0;
}
记忆化好像也要状压?算了,不写了。