1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| import java.util.Scanner;
public class Main {
public static int [][] arr; public static String [] d; static int[] visit ; static int minLen,all=0;
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int m = scanner.nextInt(); int n ; while(m-->0){ n = scanner.nextInt(); arr = new int[n][n]; d = new String[n]; visit = new int[n]; for (int i = 0; i < n; i++) { d[i] = scanner.next(); all+=d[i].length(); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) {
if(i == j){ ;continue;} add(i,j); } }
minLen = all+1; for (int i = 0; i < n; i++) { visit[i] = 1; DFS(n,1,d[i].length(),i); visit[i] = 0; } System.out.println(minLen); } }
static void add(int i,int j){ int len = Math.min(d[i].length(),d[j].length()); for (int k = len; k >= 0; k--) { int h = 0; for(;h<k;h++){ if (d[i].charAt(d[i].length()-k+h)!=d[j].charAt(h)){ break; } } if(h == k){ arr[i][j] = d[j].length()-k; break; } } }
public static void DFS(int n,int m,int len,int now){ if(len>minLen){return;} if(n == m){ minLen =Math.min(len,minLen); return; }
for (int i = 0; i < n; i++) { if(visit[i] == 0){ visit[i] = 1; DFS(n,m+1,len+arr[now][i],i); visit[i] = 0; } } } }
|