zoukankan      html  css  js  c++  java
  • poj 1699 Best Sequence

    http://poj.org/problem?id=1699

    题意:给你n个长度为L的序列,求包含这几个序列的最短长度。

    先预处理每两个序列之间的关系,然后dfs枚举就行。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define maxn 500
     5 using namespace std;
     6 const int inf=1<<30;
     7 
     8 char str[maxn][maxn];
     9 int c[maxn][maxn];
    10 int n;
    11 bool vis[maxn];
    12 
    13 int make_l(int s,int t)
    14 {
    15     int cnt=0;
    16     int k1=strlen(str[s]);
    17     int k2=strlen(str[t]);
    18     for(int i=0; i<=k1&&i<=k2; i++)
    19     {
    20         bool flag=false;
    21         for(int j=0; j<i; j++)
    22         {
    23             if(str[s][k1-i+j]!=str[t][j])
    24             {
    25                 flag=true;
    26                 break;
    27             }
    28         }
    29         if(!flag) cnt=i;
    30     }
    31     return k1-cnt;
    32 }
    33 
    34 int dfs(int src,int step)
    35 {
    36     int sum=inf;
    37     if(step==n)
    38     {
    39         int kl=strlen(str[src]);
    40         return kl;
    41     }
    42     for(int i=1; i<=n; i++)
    43     {
    44         if(!vis[i])
    45         {
    46             vis[i]=true;
    47             int sum1=c[src][i];
    48             sum1+=dfs(i,step+1);
    49             vis[i]=false;
    50             sum=min(sum,sum1);
    51         }
    52     }
    53     return sum;
    54 }
    55 
    56 int main()
    57 {
    58     int t1;
    59     scanf("%d",&t1);
    60     while(t1--)
    61     {
    62        scanf("%d",&n);
    63        for(int i=1; i<=n; i++)
    64        {
    65            scanf("%s",str[i]);
    66        }
    67        memset(c,0,sizeof(c));
    68        for(int i=1; i<=n; i++)
    69        {
    70            for(int j=1; j<=n; j++)
    71            {
    72                if(i==j) continue;
    73                c[i][j]=make_l(i,j);
    74            }
    75        }
    76        /*for(int i=1; i<=n; i++)
    77        {
    78            for(int j=1; j<=n; j++)
    79            {
    80                printf("%d ",c[i][j]);
    81            }
    82            printf("
    ");
    83        }*/
    84        memset(vis,false,sizeof(vis));
    85        int ans=inf;
    86        for(int i=1; i<=n; i++)
    87        {
    88            vis[i]=true;
    89            ans=min(ans,dfs(i,1));
    90            vis[i]=false;
    91        }
    92        printf("%d
    ",ans);
    93     }
    94     return 0;
    95 }
    View Code
  • 相关阅读:
    法师 南邮NOJ网络赛2083
    法师 南邮NOJ网络赛2083
    法师 南邮NOJ网络赛2083
    水NOJ Duplicate Removal
    水NOJ Duplicate Removal
    水NOJ Duplicate Removal
    水NOJ Duplicate Removal
    【POJ】3630 Phone List
    【POJ】2503 Babelfish
    【POJ】1451 T9
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3764712.html
Copyright © 2011-2022 走看看