状压,70pts,求助,WA #4#5#7
  • 板块P1278 单词游戏
  • 楼主MornHus
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/15 11:02
  • 上次更新2023/11/15 14:53:47
查看原帖
状压,70pts,求助,WA #4#5#7
752094
MornHus楼主2023/11/15 11:02
#include<bits/stdc++.h>
using namespace std;
int n;
char s[18][105];
int len[18];
int dp[1<<17];
int can[17];
int could[1<<17];
int ans;
//在该状态下所能转移到的,所有的字符串(单个)
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%s",s[i]+1);
        len[i]=strlen(s[i]+1);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(j==i)continue;
            if(s[i][len[i]]==s[j][1])can[i]|=(1<<(j-1));
        }
    }
    for(int i=0;i<(1<<n);i++){
        for(int j=1;j<=n;j++){
            if(i&(1<<(j-1))){
                could[i]|=can[j];
            }
        }
    }
    could[0]=(1<<n)-1;
    dp[0]=0;
    for(int i=0;i<(1<<n);i++){
        for(int j=1;j<=n;j++){
            if((1<<(j-1))&i)continue;

            if( (1<<(j-1))&could[i]  ){
                dp[i|(1<<(j-1))]=max(dp[i]+len[j],dp[i|(1<<(j-1))]);
            }

        }
        ans=max(dp[i],ans);
    }
    cout<<ans;
    return 0;
}
2023/11/15 11:02
加载中...