单词游戏

91 篇文章 1 订阅
16 篇文章 0 订阅

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值