状态压缩,用二进制来保存状态
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 }