动态规划算法(java)

一、动态规划算法

  众所周知,递归算法时间复杂度很高为(2^n),而动态规划算法也能够解决此类问题,动态规划的算法的时间复杂度为(n^2)。动态规划算法是以空间置换时间的解决方式,一开始理解起来可能比较困,自己画画也许明白了很多。

二、动态规划算法分析

先举个例子:

  

{7,0,0,0,0},{3,8,0,0,0},{8,1,0,0,0},{2,7,4,4,0},{4,5,2,6,5} 这个二维数组,求一下,顶层到底层,只能通过两端来相加的最大值(也就是说这棵树的最长路径)。

分析:

(1)第一步:有底层向上层算起,因为这是一个金字塔的形状,底层向上算起,就可以最终到一个值,这个值就是最大值,

(2)每一层相加,然后比较取最大数。即:

三、代码实现

 @Test
    public void test2(){
        int[][] arr={
            {7,0,0,0,0},
            {3,8,0,0,0},
            {8,1,0,0,0},
            {2,7,4,4,0},
            {4,5,2,6,5}
        };

        int max = maxSumNew(arr,5);
        System.out.println(max);
    }

 /**
     * 动态规划
     * @param arr
     * @param n
     * @param
     * @return
     */
    public int maxSumNew(int arr[][],int n){

        if(arr==null){
            return 0;
        }
        int[][] max = new int[n][n];
        for(int i = n-1; i >=0; i--){
            for(int j = 0; j <= i; j++){
                if(i==n-1){
                    max[n-1][j] = arr[n-1][j];
                }else{
                    max[i][j] = Math.max(max[i+1][j],max[i+1][j+1]) + arr[i][j];
                }
            }
        }
        return max[0][0];
    }

以上是小弟的总结,如果有不正确的地方,还请大牛指正。

参考url:http://blog.csdn.net/baidu_28312631/article/details/47418773

原文地址:https://www.cnblogs.com/lixiaochao/p/8443120.html

时间: 2024-10-01 05:06:10

动态规划算法(java)的相关文章

编辑距离和编辑距离的动态规划算法(Java代码)

编辑距离概念描述: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. 编辑距离的应用在信息检索.拼写纠错.机器翻译.命名实体抽取.同义词寻找等问题中有较多的应用 问题:找出

70. Climbing Stairs【leetcode】递归,动态规划,java,算法

You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? Note: Given n will be a positive integer. 题目分析:每次只能走1或2步,问n步的话有多少中走法???? 可以用动态规划和递归解

java 动态规划算法求解最长公共子串

最近在项目中碰到了这样的一个问题,要比较JS和CSS是否做了修改,先是想着借助第三方工具发现没找到,后面转念一想,这个问题不就是对两个文件的第一行求最大的公共子串嘛,既然是要求公共子串的最大长度,由此想到了动态规划算法. 代码是从网上C++改写过来的,感谢那位C++的兄弟,代码如下: package dp; /** * 用动态规划算法求解 最长公共子串 * @author * */ public class LCSSuffix { private static String getLCSLeng

五种常用算法之二:动态规划算法

动态规划算法: 基本思想: 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的.若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次.如果我们能够保存已解决的子问题的答案,而在需要时再找

动态规划算法之:最长公共子序列 & 最长公共子串(LCS)

1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab") b a b c 0 0 0 a 0 1

动态规划算法求解0,1背包问题

首先我们来看看动态规划的四个步骤: 1. 找出最优解的性质,并且刻画其结构特性: 2. 递归的定义最优解: 3. 以自底向上的方式刻画最优值: 4. 根据计算最优值时候得到的信息,构造最优解 其中改进的动态规划算法:备忘录法,是以自顶向下的方式刻画最优值,对于动态规划方法和备忘录方法,两者的使用情况如下: 一般来讲,当一个问题的所有子问题都至少要解一次时,使用动态规划算法比使用备忘录方法好.此时,动态规划算法没有任何多余的计算.同时,对于许多问题,常常可以利用其规则的表格存取方式,减少动态规划算

动态规划算法解最长公共子序列LCS问题

第一部分.什么是动态规划算法 ok,咱们先来了解下什么是动态规划算法. 动态规划一般也只能应用于有最优子结构的问题.最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似).简单地说,问题能够分解成子问题来解决. 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方式计算最优解的值   //此3步构成动态规划解的基础. 由计算出的结果构造一个最优解.   //此步如果只要求计算最优解的值时,可省略. 好,接下来,咱们

记表备查-----动态规划算法

1.最优子结构 ?组合优化问题,指的是问题有多个可行解,每一个可行解对应一个目标值,目的是要在可行解中求得目标值最优者(最大或最小). ?最优子结构特性指的是问题的最优解包含的子问题的解相对于子问题而言也是最优的. 2.子问题重叠 ?问题的一个递归算法在每个递归步骤产生分支子问题时并不总是新的,而是对部分子问题解了又解.当一个递归算法一次又一次地访问同一个子问题时,我们说该最优化问题具有重叠子问题的特性. 3.动态规划 ?针对具有上述两个特征的优化问题,动态规划算法通常需要做如下的3步工作: ?

01背包问题的动态规划算法

01背包问题我最初学会的解法是回溯法,第一反应并不是用动态规划算法去解答.原因是学习动态规划算法的时候,矩阵连乘.最长公共子串等问题很容易将问题离散化成规模不同的子问题,比较好理解,而对于01背包问题则不容易想到将背包容量离散化抽象出子问题,从情感上先入为主也误以为动态规划算法不是解决01背包问题的好方法,实际上并不是这样的.另外,动态规划算法不对子问题进行重复计算,但是要自底向上将所有子问题都计算一遍,直到计算出最终问题的结果也就是我们要的答案,有点像爬山的感觉. 问题描述:给定n种物品和一背