题意:
题意比交难理解,直接描述了,说这里有一些字符串,一个字符串必须由另外一字符串 “衍生” 出来,衍生的价值是 这两个字符串之间的 distance 距离,即俩个字符串的相同位置总共有几个字符不一样。比如 aaaaaaa 和 baaaaaa的 distance 距离为 1;给你 N 个字符串,让你给出一个衍生方案,使最后的衍生价值最小。
思路:
这道题可以转化为求最小生成树的一道题,每个字符串可以看成一个点,每个字符串之间的 distance 距离便是这俩个点的权值。这里用P算法来做这道题,注意的是把邻接矩阵的对角线设为无穷大,即自己与自己的距离是无穷大。
代码:
1 import java.util.Scanner; 2 public class Main { 3 final static int MAXN = 2000 + 3; 4 final static int INF = 100000 + 3; 5 static int[][] arv = new int[MAXN][MAXN]; 6 static int[] used = new int[MAXN]; 7 static int[] lowCose = new int[MAXN]; 8 public static void main(String[] args){ 9 Scanner sc = new Scanner(System.in); 10 int N; 11 while(true){ 12 N = sc.nextInt(); 13 if(N == 0 ){ 14 break; 15 } 16 String[] str = new String[MAXN]; 17 for(int i = 1; i <= N; i++){ 18 str[i] = sc.next(); 19 } 20 for(int i = 1; i <= N; i++){ 21 for(int j = i + 1; j <= N; j++){ 22 arv[i][j] = arv[j][i] = getDis(str[i], str[j]); 23 } 24 arv[i][i] = INF; 25 } 26 int ans = prim(1,N); 27 System.out.print("The highest possible quality is 1/"); 28 System.out.println(ans + "."); 29 } 30 sc.close(); 31 } 32 public static int getDis(String a, String b){ 33 int dis = 0; 34 char[] ca = a.toCharArray(); 35 char[] cb = b.toCharArray(); 36 for(int i = 0; i < a.length(); i++){ 37 if(ca[i] != cb[i]){ 38 dis++; 39 } 40 } 41 return dis; 42 } 43 public static int prim(int sta, int N){ 44 for(int i = 1; i <= N; i++){ 45 lowCose[i] = arv[sta][i]; 46 used[i] = 0; 47 } 48 used[sta] = 1; 49 int cntWgt = 0; 50 for(int i = 1; i <= N -1; i++){ 51 int v = -1; 52 int mini = INF; 53 for(int j = 1; j <= N; j++){ 54 if(used[j] == 0 && mini > lowCose[j]){ 55 mini = lowCose[j]; 56 v = j; 57 } 58 } 59 if(v != -1){ 60 cntWgt += lowCose[v]; 61 used[v] = 1; 62 for(int j = 1; j <= N; j++){ 63 if(used[j] == 0 && lowCose[j] > arv[v][j]){ 64 lowCose[j] = arv[v][j]; 65 } 66 } 67 } 68 } 69 return cntWgt; 70 } 71 }