动态规划

1.求一个整数序列的最长递增子序列。
2.编辑距离算法。即从一个字符串转换成另一个字符串的最少操作次数。允许添加,删除或是替换字母。
3.两个整数数组,从每个数组中有序取m个数,两两相乘后的和最大。求最大和。
4.求两个字符串的最长公共子串。
java 代码
  2.编辑距离算法。即从一个字符串转换成另一个字符串的最少操作次数。允许添加,删除或是替换字母。
  1. public int getDistance(String s1, String s2) {  
  2.        int[][] array = new int[s1.length() + 1][s2.length() + 1];  
  3.        for (int i = 0; i <= s1.length(); i++) {  
  4.            array[i][0] = i;  
  5.        }  
  6.        for (int j = 0; j <= s2.length(); j++) {  
  7.            array[0][j] = j;  
  8.        }  
  9.        for (int i = 1; i <= s1.length(); i++) {  
  10.            for (int j = 1; j <= s2.length(); j++) {  
  11.                array[i][j] = Integer.MAX_VALUE;  
  12.                array[i][j] = Math.min(array[i][j], array[i - 1][j] + 1);  
  13.                array[i][j] = Math.min(array[i][j], array[i][j - 1] + 1);  
  14.                int c = s1.charAt(i - 1) == s2.charAt(j - 1) ? 0 : 1;  
  15.                array[i][j] = Math.min(array[i][j], array[i - 1][j - 1] + c);  
  16.            }  
  17.        }  
  18.        return array[s1.length()][s2.length()];  
  19.    }  


java 代码
  3.两个整数数组,从每个数组中有序取m个数,两两相乘后的和最大。求最大和。
  1. public int getMaxMulti(int[] a, int[] b, int N) {  
  2.     int[] a1 = new int[a.length + 1];  
  3.     int[] a2 = new int[b.length + 1];  
  4.     for (int i = 0; i < a.length; i++) {  
  5.         a1[i + 1] = a[i];  
  6.     }  
  7.     for (int i = 0; i < b.length; i++) {  
  8.         a2[i + 1] = b[i];  
  9.     }  
  10.     int[][][] m = new int[N + 1][a1.length][a2.length];  
  11.     for (int k = 1; k <= N; k++) {  
  12.         for (int i = k; i < a1.length; i++) {  
  13.             for (int j = k; j < a2.length; j++) {  
  14.                 int max = Integer.MIN_VALUE;  
  15.                 if (i - 1 >= k) {  
  16.                     max = Math.max(max, m[k][i - 1][j]);  
  17.                 }  
  18.                 if (j - 1 >= k) {  
  19.                     max = Math.max(max, m[k][i][j - 1]);  
  20.                 }  
  21.                 max = Math.max(max, m[k - 1][i - 1][j - 1] + a1[i] * a2[j]);  
  22.                 m[k][i][j] = max;  
  23.             }  
  24.         }  
  25.     }  
  26.   
  27.     return m[N][a.length][b.length];  
  28. }  
    java 代码
     
    1. //最长公共字串
    2. public class LongestCommonSequence {  
    3.   
    4.     /** 
    5.      * @param args 
    6.      */  
    7.     public static void main(String[] args) {  
    8.         System.out  
    9.             .println(new LongestCommonSequence().getLCS("pailbyujcdfefdghijk""abcaduefsgdhdijdfk"));  
    10.   
    11.     }  
    12.   
    13.     public String getLCS(String s1, String s2) {  
    14.         int[][] lens = new int[s1.length() + 1][s2.length() + 1];  
    15.         // 0 for [i][j], 1 for [i][j-1], -1 for [i-1][j]  
    16.         int[][] directions = new int[s1.length() + 1][s2.length() + 1];  
    17.         for (int i = 1; i <= s1.length(); i++) {  
    18.             for (int j = 1; j <= s2.length(); j++) {  
    19.                 if (s1.charAt(i - 1) == s2.charAt(j - 1)) {  
    20.                     lens[i][j] = lens[i - 1][j - 1] + 1;  
    21.                     directions[i][j] = 0;  
    22.                 } else if (lens[i][j - 1] >= lens[i - 1][j]) {  
    23.                     lens[i][j] = lens[i][j - 1];  
    24.                     directions[i][j] = 1;  
    25.                 } else {  
    26.                     lens[i][j] = lens[i - 1][j];  
    27.                     directions[i][j] = -1;  
    28.                 }  
    29.             }  
    30.         }  
    31.   
    32.         return getCommon(s1, directions, s1.length(), s2.length());  
    33.     }  
    34.   
    35.     private String getCommon(String s1, int[][] directions, int len1, int len2) {  
    36.         if (len1 == 0 || len2 == 0) {  
    37.             return "";  
    38.         }  
    39.         if (directions[len1][len2] == 0) {  
    40.             return getCommon(s1, directions, len1 - 1, len2 - 1) + s1.charAt(len1 - 1);  
    41.         } else if (directions[len1][len2] == 1) {  
    42.             return getCommon(s1, directions, len1, len2 - 1);  
    43.         } else {  
    44.             return getCommon(s1, directions, len1 - 1, len2);  
    45.         }  
    46.     }  
    47. }  

你可能感兴趣的:(C++,c,算法,C#,J#)