算法重拾之路——动态规划基础

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

闲谈: 快到期末了,身为计算机专业大三学生,各种大作业缠身,到了大三,不再局限于考试了,学校更重视的是实践能力,所以各种大作业啊,并行计算、软件工程、软件综合设计
等等,有些东西,要求做的,在前两年,没有学过,于是又去学习,基本要把时间榨干了,这本书看了很多,就是一直没时间去更新。继续努力吧!

这二章    动态规划

1.基本思想

动态规划的基本思想也是 将待求解问题分解成若干子问题,先求子问题,然后从这些子问题的解 得到 原问题的解。

但是,与分治法不同的是:经过分解的子问题,往往不是 相互独立 的。(分治法往往将有些子问题,重复计算多次,动态规划,用一个表 记录 所有 已解决的子问题的答案,不管用没用到,只要计算过,就存起来 )

2.按部就班

解动态规划问题的步骤:

1)找出最优解的性质,并刻画其结构特征

2)递归地定义最优值

3)以自底向上的方式计算出最优值

4)根据计算最优值时获得的信息,构造最优解

< 上面步骤 1 ~ 3 是动态规划算法的基本步骤。 在只需要求最优值的情况用1~3足够了,如果要求问题最优解,那就需要步骤4来帮忙了。>

PS: 关于最优值 和 最优解:以
矩阵连乘 为例,如果最后求 最少需要多少次乘法 ,那就是最优值;如果最后求,最少次乘法 是如何配对括号来相乘,这就是 最优解 )

3.两个兄弟

> 兄弟:最优子结构:

· 设计动态规划算法的第一步通常是要 刻画最优解的结构。

· 当问题的最优解包含了其子问题的最优解时,称该问题有最优子结构性质。

· 分析一个问题是否有最优子结构性质时,所采用的方法是 普遍性:

首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题
最优解更好的解,从而导致矛盾。

· 利用问题的最优子结构性质,以  自底向上
 的方式递归地从子问题的最优解逐步构造出整个问题的最优解。

> 兄弟:重叠子问题

· 在用递归算法  自顶向下 解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规
划算法正是利用这种子问题重叠性质,对每一个子问题,只求解一次,将解存入表格,下次用到,直接查看表
格。

4.变形之 备忘录法

备忘录方法是动态规划算法的变形,与动态规划一样,备忘录方法也是用表格存储子问题的答案。但是,与普通动态规划方法不同的是,备忘录方法的 递归方式 是  自顶向下 的,而动态规划的算法是 自底向上 的。

因此,备忘录方法的控制结构 与 直接递归的控制结构相同,区别在于,备忘录方法有表来存储子问题的答案。

一般的来讲,当一个问题的所有子问题都至少要解一次时,用动态规划方法比用备忘录方法好。此时,动态规划算法没有任何多余计算。当子问题的空间中 部分子问题可不必求解时,用备忘录方法比较有利。

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

时间: 2024-11-06 10:47:57

算法重拾之路——动态规划基础的相关文章

算法重拾之路——最长公共子序列(LCS)

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 第二章:动态规划 最长公共子序列 算法描述: 一个给定序列的子序列是该序列中删去若干元素后得到的序列.确切的说,若给定序列 X={ x1,x2,...,xm },则另一序列 Z = { z1,z2, ... ,zk },是X的子序列是指存在一个严格递增下标序列

算法重拾之路——最大子段和

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 第二章:动态规划 >最大子段和< 算法描述: ?给定由n个整数(可能为负整数)组成的序列 a1,a2, ... , an ,求该序列形如  从ai 到 aj (i ≤ j)的子段和的最大值.当所有整数均为负整数时定义其最大值为0.根据这个定义,所求的最优值为:

算法重拾之路——矩阵连乘问题

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 第二章:动态规划 矩阵连乘问题 算法描述: 给定n个矩阵{A1,A2,...,An},其中Ai 与 Ai+1 是可乘的,i=1,2, ... ,n-1.考察这n个矩阵的连乘积 A1A2, ... ,An. 由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同

算法重拾之路——凸多边形最优三角剖分

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 第二章:动态规划 >凸多边形最优三角剖分< 算法描述: ? 多边形: 平面上一条分段线性闭曲线.即 一系列首尾相接的直线段所组成的. ? 通常用多边形顶点的逆时针序列表示 凸多边形,即 P = { v0,v1,...,vn-1 } 表示具有n条边,v0,v1,

算法重拾之路——快速排序

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 第一章:分治与递归 快速排序 算法描述: 同合并排序一样,就是对于一堆数据进行排序. 快排的原理就是,找一个标准,以这个标准为中心进行扩展.就像以前 做操 的时候,老师会说,以XXX为基准,成体操队形散开,这时,XXX左右的人分别就会向它看齐,并向外扩散.快排原

算法重拾之路——strassen矩阵乘法

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 第一章:分治与递归 STRASSEN矩阵乘法 算法描述: 矩阵乘法是线性代数中最常见的问题之一,它在数值计算中有广泛的应用.设A 和 B 是两个n × n矩阵,它们的乘积AB同样是一个n×n矩阵.A和B的乘积矩阵C 中的元素cij定义为: 按照这个定义来看,计算

算法重拾之路——棋盘覆盖

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 隶属于递归与分治 棋盘覆盖问题 问题描述: 在一个2^k × 2^k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则该方格为一特殊方格,且称该棋盘为一特殊棋盘.在棋盘覆盖问题中,用下图所示四种' L '型骨牌覆盖一个给定的特殊棋盘中除特殊方格之外的所有方格,

算法重拾之路——合并排序

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 隶属于递归与分治 合并排序 问题描述:实现对n个元素的排序. 算法描述:不断将待排序的元素分成大小大致相同的两个子集合各自排序,最终将排序好的两个子集合合并.集合不断递归分下去,直至集合元素个数为1. 算法程序: <span style="font-fam

算法重拾之路——大数乘法

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 隶属于递归与分治 描述:设X与Y都是n位十进制的整数,现在要计算它们的乘积XY. 朴素法:用小学时候学过的方法,模拟乘,这样计算步骤太多,效率很低,时间复杂度达到了O(n^2)的地步. 分治法:将n为十进制整数分为两段每段长为n/2位,如下所示: 所以,X= A