题目:
无意间A了。。超时一次,加了一句 if(len > ans)return; 然后就A了,dfs题,没有太多好说的,代码写的效率高一点就行。
1 #include2 #include 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 else19 {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 }