poj1699--Best Sequence (DFS+查表)

思路:深度搜索全排列,将每两个相连的结果做成表格,得出最小。

#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\n",ans);
    }
    return 0;
}

 

posted @ 2017-03-27 12:18  Mr.Struggle  阅读(577)  评论(0编辑  收藏  举报