P1278 单词游戏

题目链接

记忆化搜索。

#include
#include
#include
#include
#include
#define LL long long
using namespace std;
const int M=(1<<17);
int f[M][20],n,len[20],ans;
char s[20][109];
int dfs(int x,int S)//S这个状态,最后一个单词是x,再往后接,能够得到的最长长度
{
    int sum=len[x],ML=0;
    for(int i=1;i<=n;i++)
    if(!(S&(1<1)))
    {
        if(s[x][len[x]-1]==s[i][0])
        {
            ML=max(ML,f[S^(1<1)][i]?f[S^(1<1)][i]:f[S^(1<1)][i]=dfs(i,S^(1<1)));
        }
    }
    return f[S][x]=sum+ML;
}
int main()
{
    scanf("%d\n",&n);
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];
        len[i]=strlen(s[i]);
    }
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,f[1<1][i]?f[1<1][i]:f[1<1][i]=dfs(i,(1<1)));
    }
    printf("%d",ans);
    return 0;
}

你可能感兴趣的:(dfs)