思路:深度搜索全排列,将每两个相连的结果做成表格,得出最小。
#include<stdio.h> #include<string.h> char seg[10][20]; //读入数据 int book[10]; //记录是否已经使用过 int len[10]; //记录每个seg的长度 int ans; //记录最后结果 int t,n; int addlen[11][11]; //通过二维数组记录相连后增加的长度,用于查表 void add(int m,int n){ int l,i,j,k; k=0; for(int l=1;l<=len[n]&&l<=len[m];l++){ int sign=1; for(i=0,j=len[m]-l;i<l;i++,j++) if(seg[m][j]!=seg[n][i]){ sign=0; break; } if(sign) k=l; } addlen[m][n]=len[n]-k; } void dfs(int pre,int sum,int step){ if(sum>ans) return; if(step==n){ if(sum<ans) ans=sum; return; } for(int i=0;i<n;i++){ if(book[i]==0){ book[i]=1; dfs(i,sum+addlen[pre][i],step+1); book[i]=0; } } } int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",&seg[i]); len[i]=strlen(seg[i]); } for(int i=0;i<n;i++) for(int j=0;j<n;j++){ add(i,j); //通过函数制表 } ans=1000; for(int i=0;i<10;i++) book[i]=0; for(int i=0;i<n;i++){ book[i]=1; dfs(i,len[i],1); book[i]=0; } printf("%d ",ans); } return 0; }