POJ 1699 Best Sequence dfs
题目: http://poj.org/problem?id=1699
无意间A了。。超时一次,加了一句 if(len > ans)return; 然后就A了,dfs题,没有太多好说的,代码写的效率高一点就行。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n", ans); 78 } 79 return 0; 80 }