• 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
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    巴厘岛的雕塑(sculptures)
    BZOJ4361: isn
    BZOJ2131: 免费的馅饼
    BZOJ4240: 有趣的家庭菜园
    BZOJ5484: [Usaco2018 Dec]Sort It Out
    BZOJ 2151: 种树
    HDU 1285 确定比赛名次(拓扑排序+优先队列)
    申请中文域名并跳转到个人网站(多种方法的尝试)
    Java binarysearch方法
    eclipse2019-12设置中文
  • 原文地址:https://www.cnblogs.com/lvcoding/p/6626113.html
Copyright © 2020-2023  润新知