問題:java
對於長度相同的2個字符串A和B,其距離定義爲相應位置字符距離之和。2個非空格字符的距離是它們的ASCII碼之差的絕對值;空格與空格的距離爲0,空格與其餘字符的距離爲一個定值k。在通常狀況下,字符串A和B的長度不必定相同。字符串A的擴展是在A中插入若干空格字符所產生的字符串。在字符串A和B的全部長度相同的擴展中,有一對距離最短的擴展,該距離稱爲字符串A和B的擴展距離。對於給定的字符串A和B,設計一個算法,計算其擴展距離。算法
測試數據:測試
輸入:cmc snmn 2 (分別表示字符串A、B和定值k)spa
輸出:10.net
輸入:cdd snmn 1 (分別表示字符串A、B和定值k)設計
輸出:7code
輸入:cd ad 1 (分別表示字符串A、B和定值k)orm
輸出:2blog
//當場沒作出來,汗顏啊字符串
//回來查了下,原來是動態規劃
//JAVA實現了一下:
import static java.lang.Math.abs; import static java.lang.Math.min; public class DPString { public static int MAX_LEN = 2014; public static int work(char str1[], char str2[], int k) { int[][] dp = new int[MAX_LEN][MAX_LEN]; int length1 = str1.length; int length2 = str2.length; dp[0][0] = 0; for (int i = 1; i <= length1; i++) { dp[i][0] = i * k; } for (int i = 1; i <= length2; i++) { dp[0][i] = i * k; } for (int i = 1; i <= length1; i++) { for (int j = 1; j <= length2; j++) { dp[i][j] = min(dp[i - 1][j - 1] + abs(str1[i - 1] - str2[j - 1]), min(dp[i - 1][j], dp[i][j - 1]) + k); } } return dp[length1][length2]; } public static void main(String[] args) { String stra = "cdd"; String strb = "snmn"; int k = 1; System.out.println(work(stra.toCharArray(), strb.toCharArray(), k));// output 7 } }
呵呵,寫完以後發現網上有篇更詳細的解析: