精华内容
下载资源
问答
  • 动态规划的基本思想
    千次阅读
    2019-01-11 16:25:59

    分治法

    将一个规模为n的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题相同。递归的解决这些问题,然后将各个子问题的解合并得到原问题的解

    贪心法

    当前的选择可能要依赖于已经做出的选择,但不依赖于有待于做出的选择和子问题。因此贪心法是自顶向下,一步一步地做出贪心的选择

    动态规划

    动态规划的实质是分治思想和解决冗余,因此动态规划是一种将问题实例分析为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略

    动态规划所针对的问题有一个显著的特征,即它对应的子问题树中的子问题呈现大量的重复。动态规划的关键在于,对于重复的子问题,只在第一次遇到时求解,并把答案保存起来,让以后再遇到时直接引用,不必要重新求解

    更多相关内容
  • 2022年学校教职工思想动态分析报告范文2篇工作汇报总结 .pdf
  • 学生疫情期间学习生活及思想动态调研报告(高校).docx
  • 寒假返校后学生思想动态调查报告参考.doc
  • 职工思想动态及思想政治工作调查报告.doc
  • 正确把握员工思想动态,做好思想工作.doc
  • 大学生暑期思想动态报告.doc 大学生暑期思想动态报告.doc
  • 企业职工思想动态及改进思想政治工作浅谈.doc
  • 动态规划思想总结

    千次阅读 2019-10-23 12:47:17
    1、自底向上:思想是逆向的,但也能正向解答。两者是相同的,只是求解顺序不一样。 2、状态转移方程:对于这个,我只能说,暴力怎么解,动态规划就怎么解。因为求解动态规划的顺序是先暴力递归——带备忘录的递归...

    动态规划又叫做填表法,就是说动态规划就是个填表游戏
    1、自底向上:思想是逆向的,但也能正向解答。两者是相同的,只是求解顺序不一样。
    2、状态转移方程:对于这个,我只能说,暴力怎么解,动态规划就怎么解。因为求解动态规划的顺序是先暴力递归——带备忘录的递归——动态规划。并且看博客多了的人会发现,其实递归的递归体就是动态规划的状态转移方程。不同的思考,得出的状态转移方程也不一样
    3、最优子问题:大问题分成小问题,小问题寻找最优解构成大问题的最优解。这一点不必太在意,因为求解的过程就是在求解小问题的最优解。
    最后学习动态规划,当靠理论是不行的,得结合实战,下列给出动态规划的例子(之后会陆陆续续的增加各种各样的例子供大家学习)
    1、最大连续子序列和
    2、数字三角型最小路径
    3、最长公共子序列
    4、最长递增序列
    5、01背包问题(不同定义的不同解法)

    展开全文
  • 动态规划基本思想

    千次阅读 2018-07-04 11:24:38
    动态规划和分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,动态规划法中分解得到的子问题不是互相独立的。若用分治法来解这类...

    基本要素:
    (1)最优子结构性质
    (2)重叠子问题性质
    思想:
    动态规划和分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
    与分治法不同的是,动态规划法中分解得到的子问题不是互相独立的。若用分治法来解这类子问题,分解得到的子问题数目非常多,最后解决原问题需要耗费指数时间。但是这些子问题有很多是相同的,也就是同一个子问题被计算了很多次,不同子问题的数量可能只有多项式量级。
    如果我们保存已经解决的子问题的解,需要解相同子问题时找出已经计算出的解,这样可以减少大量重复计算,最终得到多项式时间算法。
    经常用一个来记录所有已解决的子问题的解。不管该子问题以后是否被利用,只要它被计算过,就将其结果填入表中。这就是动态规划的基本思想。具体的动态规划算法多种多样,但它们具有相同的填表格式

    —(计算机算法设计与分析 第四版 王晓东)—
    ####动态规划例子:(矩阵连乘问题)
    给定N个矩阵{A1,A2,A3,An},其中Ai与A(i+1)是可以相乘的,考察这N个矩阵的连乘积A1A2,An。
    由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定,比如下面4个矩阵的连乘积。
    A1,A2, A3, A4
    1,(2,(3,4))
    1,((2,3),4)
    (1,2),(3,4)
    (1,(2,3)),4
    ((1,2),3),4

    #####最优解的结构
    计算A[1:n]的最优次序所包含的计算矩阵子链A[1:k]和A[k+1:n]的次序也是最优的。
    A[1:n] = A[1:k] * A[K+1:n] 其中 ( 1 < k < n)
    递推关系如下:
    m(i , j) = 0 ,(i=j)
    m(i , j) = min{ m(i,k) + m(k+1,j) + P(i-1)P(k)P(j) } ,(i < j )
    #####重叠子问题
    重叠的子问题主要体现在m表格里,

    例题:我们计算如下6个矩阵的连乘积,
    A1 ------ A2 ------ A3 ----- A4 ----- A5 ----- A6
    (3035) (3515) (155) (510) (1020) (2025)

    const int N = 6;
    int table[N + 1][N + 1];
    int p[N + 1] = { 30, 35, 15, 5, 10, 20, 25 };
    void MatrixMulti()
    {
    	for (int r = 2; r <= N; r++) //r表示连乘矩阵的个数
    	{
    		for (int i = 1; i <= N - r + 1; i++) //i表示起始矩阵索引
    		{
    			int j = i + r - 1; //j表示终止矩阵索引
    			for (int k = i; k < j; k++)
    			{
    				int temp = table[i][k] + table[k+1][j] + p[i - 1] * p[k] * p[j];
    				table[i][j] = (table[i][j] == 0) ? temp : min(table[i][j], temp);
    			}
    		}
    	}
    }
    int main()
    {
    	MatrixMulti();
    	cout << "最小乘积为:" <<table[1][N] << endl;
    	return 0;
    }
    /*输出结果:
    最小乘积为:15125
    table数组内容为:
    0       0       0       0       0       0       0
    0       0       15750   7875    9375    11875   15125
    0       0       0       2625    4375    7125    10500
    0       0       0       0       750     2500    5375
    0       0       0       0       0       1000    3500
    0       0       0       0       0       0       5000
    0       0       0       0       0       0       0
    
    */
    
    展开全文
  • 文章目录1.序2.动态规划的基本概念[^1]3.动态规划算法的基本思想[^2]4....这篇文章主要介绍动态规划算法的基本思想、使用动态规划算法求解问题的基本步骤、动态规划算法的两个基本要素以及一些经典的动态规划问题。...

    1.序

    近期笔者会写一些博客,与大家共同讨论一些经典的算法思想。这篇文章主要介绍动态规划算法的基本思想、使用动态规划算法求解问题的基本步骤、动态规划算法的两个基本要素以及一些经典的动态规划问题。

    2.动态规划的基本概念[^1]

    在学习动态规划之前,先思考这样一个问题:什么是动态规划?为什么叫动态规划?
    当读者在试图探索这个问题的时候,不可避免的要了解动态规划的产生背景。动态规划是由 Dynamic Programming 翻译过来的。动态规划的概念是由美国数学家R.E.Bellman等人提出的,应用于工程领域。
    动态规划是是求解多阶段决策过程(decision process)的最优化问题一种方法。

    所谓多阶段决策过程是指这样一类决策过程:它可以把一一个复杂问题按时间(或空间)分成若干个阶段,每个阶段都需要作出决策,
    以便得到过程的最优结局。由于在每阶段采取的决策是与时间有关的而且前一阶段采取的决策如何,不但与该阶段的经济效果有关,
    还影响以后各阶段的经济效果,可见这类多阶段决策问题是一个动态的问题,因此,处理的方法称为动态规划方法。然而,动态
    规划也可以处理一些本来与时间没有关系的静态模型,这只要在静态模型中人为地引入“时间”因素,分成时段,就可以把它看作
    是多阶段的动态模型,用动态规划方法去处理。
    

    简言之,多阶段决策过程是指这样的一类特殊的活动过程:问题可以按时间顺序分解成若干相互联系的阶段,在每一个阶段都要做出决策,全部过程的决策是一个决策序列。
    下面举例说明什么是多阶段决策问题。
    例1(最短路线问题)在线路网络图1中,从A至E有一批货物需要调运。图上所标数字为各节点之间的运输距离,为使总运费最少,必须找出一条由A至E总里程最短的路线。
    在这里插入图片描述

    图1

    为了找到由A至E的最短线路,可以将该问题分成A—B—C—D—E 4个阶段,在每个阶段都需要作出决策,即在A点需决策下一步到B1还是到B2或B3;同样,若到达第二阶段某个状态,比如B1 ,需决定走向C1还是C2 ;依次类推,可以看出:各个阶段的决策不同,由A至E的路线就不同,当 从某个阶段的某个状态出发作出一个决策,则这个决策不仅影响到下一个阶段的距离,而且直接影响后面各阶段的行进线路。所以这类问题要求在各个阶段选择一个恰当的决策,使这些决策序列所决定的一条路线对应的总路程最短。

    3.动态规划算法的基本思想[^2]

    动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题。
    在这里插入图片描述

    图2

    但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。
    如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。
    在这里插入图片描述

    图3

    4.动态规划的求解步骤[^2]

    a. 找出最优解的性质,并刻划其结构特征。
    b. 递归地定义最优值。
    c. 以自底向上的方式计算出最优值。
    d. 根据计算最优值时得到的信息,构造最优解

    5.动态规划算法的基本要素[^2]

    5.1 最优子结构

    • 矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质
    • 在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。
    • 利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。

    注意:同一个问题可以有多种方式刻划它的最优子结构,有些表示方法的求解速度更快(空间占用小,问题的维度低)

    5.2 重叠子问题

    • 递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。
    • 动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。
    • 通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。
      在这里插入图片描述
      图4

    6.一些经典的动态规划问题

    题目描述:
    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

    示例 1:

    输入: "babad"
    输出: "bab"
    注意: "aba" 也是一个有效答案。
    

    示例 2:

    输入: "cbbd"
    输出: "bb"
    

    分析:
    一个问题要使用动态规划求解,一定要满足【最优子结构】,只有满足最优子结构,才能通过子问题的解 构造出 整个问题的解。

    在编码时,一般采用【备忘录】或 dp table来实现。
    最关键的要找出:该问题的递推关系式(状态转移方程)

    假设dp[i][j]=true,表示字符串s从s[i]到s[j]的子串为最长回文子串
    反之false.

    考虑 abcba 这个示例。如果我们已经知道 bca 是回文,那么要判断 abcba 是不是回文串,只需判断它的左首字母和右尾字母是否相等。这里左=右=a,因此abcba 是回文串

    从这里我们可以归纳出状态转移方程
    dp[i][j] = true
    前提是
    dp[i+1][j-1]为true,且 s[i] == s[j]

    #include <iostream>
    using namespace std;
    class MySolution {
    public:
        string longestPalindrome(string s) {
    
            int len = s.size();
            if (len < 2)
                return s;
            //bool dp[len][len];
            bool** dp;
            dp = new bool* [len];
            for (int i = 0; i < len; i++)
                dp[i] = new bool[len];//分配了len行len列的二维数组空间
        
            int max_len=1;//最大回文串长度
            int max_left;//最长回文串的起始位置
            for (int j = 0; j < len; j++)
            {
                for (int i = 0; i < j; i++)
                {
                    if (s[j] != s[i])
                        dp[i][j] = false;
                    else if (j - i < 3) // (j-1)-(i+1)+1< 2 即表明dp[i][j]是回文串
                        dp[i][j] = true;
                    else
                        dp[i][j] = dp[i + 1][j - 1];//s[i]==s[j]
                    if (j - i + 1 > max_len && dp[i][j])
                    {
                        max_len = j - i + 1;
                        max_left = i;
                    }
    
                }
            }
            return s.substr(max_left, max_len);
            // 用完要释放:
            for (int i = 0; i < len; i++)
            {
                delete[] dp[i]; 
                delete[]dp;
            }   
        }
    };
    int main()
    {
        MySolution sl;
        string s = sl.longestPalindrome("abcdedcabcdefggfedcba");
        cout << s << endl;
    }
    

    参考文献
    [1] 引用自百度文库https://wenku.baidu.com/view/c0f9fb156c175f0e7cd1377d.html
    [2]引用自老师的课件

    展开全文
  • 动态规划之一:基本思想

    万次阅读 2018-06-03 23:09:17
    基本思想一般来说,只要问题可以划分为规模更小的字问题,并且原问题的最优解中包含了子问题的最优解,则可以考虑用动态规划解决。动态规划的实质是分治思想和解决冗余。因此,动态规划是一种将问题实例分解为更小的...
  • 动态规划简介及基本思想

    千次阅读 2019-10-09 08:56:25
    动态规划(Dynamic Programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。
  • 动态规划思想以及常见应用

    千次阅读 2018-03-30 18:30:52
    动态规划的基本思想以及和贪婪算法、分治法的比较动态规划的基本思想:将复杂问题进行分解,通过求解小规模子问题反推出原问题的结果。动态规划适合求解多阶段决策问题的最优解(可以简单理解为有状态转换的阶段...
  • 分治法: 基本思想: 将问题分解成多个子问题,并允许不断分解,使规模越来越小,最终可用已知的方法求解足够小的问题。  使用要求: (1) 问题能够按照某种...问题的最优子结构性质是该问题可用动态规划算法或贪心
  • 动态代理的好处是什么

    万次阅读 多人点赞 2018-06-09 12:59:48
    静态代理:了解设计模式中的代理模式的童鞋应该都知道如果想要为被代理类生成...动态代理:其实动态代理与静态代理的本质一样,最终程序运行时都需要生成一个代理对象实例,通过它来完成相关增强以及业务逻辑,只...
  • 这里从几个经典的例子讲解了动态规划的核心思想
  • 最长公共子序列 子序列与子串 子序列:有序列中若干符号,按原相对次序构成。例如 Tsinghua中sina是它的子序列,computer中omutr是子序列。它不要求所选的字母连续,只要求是按原次序组成就好。...
  • 什么是动态代理? 动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以...
  • 1冯诺依曼体制中最核心的思想是计算机采用 (14页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!14.9 积分一、填空题1. 冯?诺依曼体制屮最核心的思想是计算机采川 工作...
  • 什么是AOP(面向切面编程)思想

    千次阅读 2018-08-03 18:24:06
    轻松理解AOP思想(面向切面编程)  本文旨在帮助还没有理解AOP的童鞋看透弄懂AOP,也欢迎高手批评指正。 先说一个Spring是什么吧,大家都是它是一个框架,但框架这个词对新手有点抽象,以致于越解释越模糊,不过它...
  • 动态规划算法思想解决找零钱问题

    万次阅读 2017-10-16 14:20:54
    前言  关于找零钱问题,网上已经有很多相关的资料以及优秀的文章博客等。这里写这篇博客的初衷很简单,就是为了方便自己,回过头来捡起这个知识能快一点,接受起来更易理解点;... 动态规划(dynamic progr...
  • 动态规划 可以直接运行的c语言动态规划思想 代码动态规划 可以直接运行的c语言动态规划思想 代码动态规划 可以直接运行的c语言动态规划思想 代码动态规划 可以直接运行的c语言动态规划思想 代码动态规划 可以直接...
  • 动态规划有着比较详细的讲解,比如动态规划的一般步骤,动态规划的思想
  • 微分动态规划的基本思想

    千次阅读 2017-08-02 01:37:19
    吴恩达cs229第19课,微分动态规划这一部分,看了两遍才看明白。 赶紧记下来: 微分动态规划是基于LQR(线性二次型)的, 后者能够比较简洁地计算最优策略,但要基于一个前提,就是 t+1 时刻的状态,是 t 时刻的...
  • 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是独立...
  • 什么是面向对象的编程思想

    千次阅读 2019-01-05 08:23:38
    面向对象的编程产生的历史原因:...于是,面向对象的编程思想就产生了。 面向对象的编程的主要思想是把构成问题的各个事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在解决问题的...
  • 应用动态规划思想解决实际问题

    千次阅读 2017-04-01 11:08:13
    应用动态规划的思想解决实际问题--“数字三角形”和“LCS”
  • Java动态代理+注解体现Spring AOP思想

    千次阅读 2017-07-31 15:48:52
    在MVC的架构中,优秀的代码是Service业务层只做业务逻辑处理,如果要添加新功能(如日志,事务等),不应该污染业务层代码。 ...1. 什么是动态代理?查理论能查几页纸,这里简单总结一句话:调用Pr
  • 动 态 规 划 (Dynamic programming) 动态规划的基本思想 .ppt

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 401,588
精华内容 160,635
关键字:

思想动态是什么