P1278 单词游戏

状态压缩,用二进制来保存状态

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 string words[17];
 5 int rem[17][70000];//末尾是第i个单词的时候,用了集合是j的元素 
 6 int ans;
 7 int dfs(int now,int book)
 8 {
 9     if(rem[now][book]!=-1)return rem[now][book];
10     rem[now][book]=0;
11     for(int i=0;i<n;i++)
12     {
13         if((words[now].end()-1)==words[i][0]/*取最后一个字母判断是否可以接*/&&((book&(1<<i))==0)/*是否用过*/)
14         {
15             rem[now][book]=max(rem[now][book],dfs(i,(book|(1<<i)))/*添加元素继续搜索*/);
16         }
17     }
18     return rem[now][book]+=words[now].size();
19 }
20 int main()
21 {
22     memset(rem,-1,sizeof(rem));
23     scanf("%d",&n);
24     for(int i=0;i<n;i++)
25         cin>>words[i];
26     for(int i=0;i<n;i++)//枚举开头的单词 
27     {
28         ans=max(ans,dfs(i,(1<<i)));
29     }
30     printf("%d",ans);
31 }

原文地址:https://www.cnblogs.com/1129-tangqiyuan/p/11614837.html