`

动态规划

阅读更多
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. }  
分享到:
评论

相关推荐

    代码 随机动态规划的实例的matlab代码

    代码 随机动态规划的实例的matlab代码代码 随机动态规划的实例的matlab代码代码 随机动态规划的实例的matlab代码代码 随机动态规划的实例的matlab代码代码 随机动态规划的实例的matlab代码代码 随机动态规划的实例的...

    浅谈动态规划的几种优化方法

    动态规划是求解最优化问题的一种方法;动态规划虽然空间复杂度一般较大,但时间效率可观。但是,动态规划在求解中也会存在一些不必要、或者重复求解的子问题,这时就需要进行进一步优化。 在NOI及省选赛场上,一般...

    基于LINGO的优化问题动态规划法求解

    【基于LINGO的优化问题动态规划法求解】 在运筹优化领域,LINGO是一款强大的数学建模软件,尤其适用于解决各种线性、非线性以及动态规划问题。不同于传统方法,LINGO甚至可以在没有明确目标函数的情况下解决动态...

    动态规划实验报告

    本实验报告主要探讨了使用动态规划算法解决计算二项式系数的问题。实验者刘春云,专业为软件工程,通过这个实验学习并应用了动态规划这一核心的计算机科学概念。实验指导教师为赵晓平,实验时间为2012年2月21日。 *...

    动态规划算法经典题目

    动态规划算法经典题目分析 动态规划是一种非常经典的算法思想,解决的问题领域非常广泛。动态规划的基本思想是将一个复杂的问题分解成多个小问题,通过解决这些小问题来解决整个问题。今天,我们将要探讨动态规划的...

    动态规划的特点及其应用

    动态规划是信息学竞赛中的常见算法,本文的主要内容就是分析 它的特点。 文章的第一部分首先探究了动态规划的本质,因为动态规划的特 点是由它的本质所决定的。第二部分从动态规划的设计和实现这两个 角度分析了动态...

    ACM动态规划经典题

    动态规划是一种重要的算法思想,广泛应用于计算机科学,特别是在解决最优化问题时,如图论、组合优化、机器学习和自然语言处理等领域。在ACM(国际大学生程序设计竞赛)中,动态规划也是常考的题型,因为它能够帮助...

    会议安排(贪心算法和动态规划) 贪心算法和动态规划.pdf

    会议安排(贪心算法和动态规划) 会议安排问题是计算机科学中的一种经典问题,目的是在一系列活动中选择尽可能多的活动,使得每个活动的结束时间不早于下一个活动的开始时间。这个问题可以使用贪心算法和动态规划两...

    贪心算法、分治算法和动态规划的区别 贪心算法和动态规划.pdf

    贪心算法、分治算法和动态规划的区别 贪心算法、分治算法和动态规划是三种常用的算法设计策略,每种算法都有其特点和应用场景。下面我们将对这三种算法进行详细的比较和分析。 分治算法 分治算法是一种将原问题...

    贪心算法和动态规划以及分治法的区别? (1) 贪心算法和动态规划.pdf

    贪心算法、动态规划和分治法的区别 贪心算法是局部最优解的算法,它通过从上往下,从顶部一步一步最优,得到最后的结果。贪心算法顾名思义,就是做出在当前看来是最好的结果,它不从整体上加以考虑,也就是局部最优...

    动态规划解决TSP问题用动态规划算法求解TSP,数据为Solomon数据集的c101文件读取,可视化路径图,用图展示每次迭代的最

    动态规划是一种解决问题的有效方法,尤其在处理具有重叠子问题和最优子结构的复杂问题时。旅行商问题(Traveling Salesman Problem, TSP)是一个经典的组合优化问题,它的目标是找到一个城市的最短可能路线,使得...

    什么是动态规划(Dynamic Programming)?动态规划的意义是什么? - 知乎1

    动态规划(Dynamic Programming,简称DP)是一种用于解决最优化问题的算法思想,它通过将大问题分解为相互重叠的子问题,并存储子问题的解,以避免重复计算,从而达到高效求解的目的。DP的核心在于它能够识别并利用...

    算法动态规划总结(拓展篇)

    从给定的文件标题“算法动态规划总结(拓展篇)”和描述“算法动态规划拓展总结,内含详细解说和代码”中,我们可以提炼出一系列关于动态规划算法的知识点,这些知识点涵盖了动态规划的多种应用及其优化技术。...

    动态规划C语言矩阵连乘

    "动态规划C语言矩阵连乘" 动态规划是一种非常重要的算法思想,它可以解决很多 Optimization 问题。在这个资源中,我们将学习如何使用动态规划来解决矩阵连乘问题。 动态规划的基本思想是将待解决的问题分解成若干...

    dynprogs_MATLAB动态规划函数及测试程序_多阶段决策_多阶段规划_together1rz_

    标题中的“dynprogs_MATLAB动态规划函数及测试程序_多阶段决策_多阶段规划_together1rz_”表明这是一个关于使用MATLAB实现动态规划算法的资源包,主要用于解决涉及多阶段决策和规划的问题。动态规划是一种在数学、...

    动态规划 增量动态规划 水库优化调度 程序代码

    动态规划增量动态规划水库优化调度程序代码 动态规划是一种常用的优化算法,它可以解决很多复杂的优化问题。增量动态规划是动态规划的一种变体,它可以更好地解决一些特殊的优化问题。在水库优化调度中,动态规划和...

    动态规划动态规划.zip

    动态规划(Dynamic Programming,简称DP)是解决复杂问题的有效算法设计方法,尤其在计算机科学和IT领域中占有重要地位。它通过将一个大问题分解为若干个子问题,并利用子问题的解来构建原问题的解,从而避免了重复...

    运用LINGO解决某些动态规划的问题

    本篇文章将深入探讨如何运用LINGO来解决动态规划问题,通过具体的案例分析,我们将了解LINGO在动态规划中的应用方法和步骤。 ### 动态规划与LINGO 动态规划是一种用于解决多阶段决策过程中的最优化问题的方法,其...

Global site tag (gtag.js) - Google Analytics