单词游戏

来源:互联网 发布:手机淘宝怎么指纹支付 编辑:程序博客网 时间:2024/05/17 20:31

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 longusing 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;}

记忆化好像也要状压?算了,不写了。

原创粉丝点击