P1278 单词游戏

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

 1 #include
 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)
12     {
13         if(*(words[now].end()-1)==words[i][0]/*取最后一个字母判断是否可以接*/&&((book&(1<0)/*是否用过*/)
14         {
15             rem[now][book]=max(rem[now][book],dfs(i,(book|(1</*添加元素继续搜索*/);
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)
25         cin>>words[i];
26     for(int i=0;i//枚举开头的单词 
27     {
28         ans=max(ans,dfs(i,(1<<i)));
29     }
30     printf("%d",ans);
31 }

 

你可能感兴趣的:(P1278 单词游戏)