zoukankan      html  css  js  c++  java
  • POJ 1699 Best Sequence dfs

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

    无意间A了。。超时一次,加了一句 if(len > ans)return; 然后就A了,dfs题,没有太多好说的,代码写的效率高一点就行。

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 char str[10][25];
     5 bool vis[10];
     6 int lenth[10];
     7 int ans, n;
     8 
     9 void dfs(int cnt, int x, char tmp[], int len)
    10 {
    11     if(len > ans)return;
    12     vis[x] = 1;
    13     if(len == 0)
    14     {
    15         strcpy(tmp, str[x]);
    16         len = lenth[x];
    17     }
    18     else
    19     {
    20         int add = (len > lenth[x]) ? len - lenth[x] : 0;
    21         bool ok = 0;
    22         while(add < len)
    23         {
    24             ok = 1;
    25             for(int j = 0; j+add < len; j++)
    26             {
    27                 if(tmp[j+add] != str[x][j])
    28                 {
    29                     ok = 0;
    30                     break;
    31                 }
    32             }
    33             if(ok)
    34             {
    35                 int k = len - add;
    36                 while(k < lenth[x])
    37                     tmp[len++] = str[x][k++];
    38                 break;
    39             }
    40             add++;
    41         }
    42         if(!ok)
    43         {
    44             strcpy(tmp+len, str[x]);
    45             len += lenth[x];
    46         }
    47     }
    48     for(int j = 0; j < n; j++)
    49     {
    50         if(!vis[j])
    51             dfs(cnt-1, j, tmp, len);
    52     }
    53     vis[x] = 0;
    54     if(cnt == 0 && ans > len)
    55     {
    56         ans = len;
    57     }
    58 }
    59 
    60 int main()
    61 {
    62     char tmp[210];
    63     int t;
    64     scanf("%d", &t);
    65     while(t--)
    66     {
    67         memset(vis, 0, sizeof(vis));
    68         ans = 0x3f3f3f3f;
    69         scanf("%d", &n);
    70         for(int i = 0; i < n; i++)
    71         {
    72             scanf("%s", str[i]);
    73             lenth[i] = strlen(str[i]);
    74         }
    75         for(int i = 0; i < n; i++)
    76             dfs(n-1, i, tmp, 0);
    77         printf("%d
    ", ans);
    78     }
    79     return 0;
    80 }
    View Code
  • 相关阅读:
    Codeforces-541div2
    动态规划-线性dp-hdu-4055
    动态规划_线性dp
    动态规划_背包问题笔记
    codeforces-1111
    数论模板
    codeforces-1114F-线段树练习
    2-sat
    拓扑排序
    强连通分量
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/3442848.html
Copyright © 2011-2022 走看看