动态规划_例题众多_详细讲解

合集下载

动态规划例题讲解精品PPT课件

动态规划例题讲解精品PPT课件
动态规划例题讲解
山东师大附中
Preview
本节课主要通过几道例题,总揽NOIp中较 常见的动态规划模型,不会过多涉及优化 内容。
Preview
最长上升子序列 内存碎片 背包问题 最长公共子序列 石子合并
括号序列 决斗 三取方格数 选课 贪吃的九头龙
最长上升子序列
给出一个数列{a1,a2,...,an},要求你选出尽量 多的元素,使这些元素按其相对位置单调
完全背包问题
共有N种物品,每种物品有一定的重量w[i] 和一定的价值v[i],每种物品有无限个。现 在我们有一个最大载重量limit的包,问放入 哪些物品能使得总价值最高?
w[i]和v[i]均为整数,N<=100,limit<=10000
完全背包问题
fillchar(f,sizeof(f),0); for i:=1 to n do for j:= w[i] to limit do f[j] = max(f[j], f[j-w[i]]+v[i]); writeln(f[limit]);
1400
共有3件物品 重量分别为30/80/10 价值分别为300/1200/200 背包最大载重量为100
0/1背包问题
令f[i,j]表示考虑完前i项物品,并且当前背包 承重不大于j的情况下能获得的最大价值
f[i,j]=max( f[i-1,j], //不选第i项物品 f[i-1,j–w[i]]+v[i]) //选择第i项物品
2
插入a6后 -inf
1
插入a7后 -inf
1
插入a8后 -inf
1
插入a9后 -inf
1
inf
inf
inf
8

动态规划练习例题

动态规划练习例题
c(m,n)为最终最小代价,反向追踪获得编辑序列
动态规划方法总结
动态规划算法的设计步骤
– – – – – – – 将问题表示成多步判断 确定是否满足优化原则——必要条件 确定子问题的重叠性——估计算法效率 列出关于优化函数的递推方程(或不等式)和边界条件 自底向上计算子问题的优化函数值----非递归的算法 备忘录方法记录中间结果 标记函数追踪问题的解
• S(i)表示结束于位置i的最大子区间和 • max{S(i)}即为所求最大子区间和 • 考虑如何递推求解并反算问题解
最大子矩阵
• 已知矩阵的大小定义为矩阵中所有元素的 和。给定一个矩阵,找到最大的非空(大小 至少是1 * 1)子矩阵。 • 例如这个矩阵的最大子矩阵大小为15。
0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
动态规划练习例题在棋盘上移动在一个nn的棋盘上棋子可以向上方右上方或左上方移动每次从x方格移动到y方格将获得pxy元钱pxy不一定是正数现求一个获得钱最多的从底边到顶边的一种移动棋子的方案
动态规划练习例题
在棋盘上移动
• 在一个n×n的棋盘上,棋子可以向上方、 右上方或左上方移动,每次从x方格移动到y 方格将获得p(x,y)元钱, p(x,y)不一定是正 数,现求一个获得钱最多的从底边到顶边 的一种移动棋子的方案。
解题思路
Qx, y 1 Q x, y max Qx 1, y 1 Q x 1, y 1 y 1 px, y 1, x, y y 1 px 1, y 1, x, y y 1且x 1 px 1, y 1, x, y y 1且x 字符串X=x1,x2,…xm和Y=y1,y2,…yn 使用一系列编辑操作将字符串X转变成Y。允许使 用插入,删除,修改三种操作,每种操作都有 一定的代价,求一个总代价最小的操作序列。 – 设从字符X中删除符号xi的代价为D(xi) – 将符号yj插入X的代价为I(yj) – 将X中的符号xi修改成yj的代价为C(xi,yj)

动态规划算法的详细原理及使用案例

动态规划算法的详细原理及使用案例

动态规划算法的详细原理及使用案例一、引言动态规划是一种求解最优化问题的算法,它具有广泛的应用领域,如机器学习、图像处理、自然语言处理等。

本文将详细介绍动态规划算法的原理,并提供一些使用案例,以帮助读者理解和应用这一算法的具体过程。

二、动态规划的基本原理动态规划算法通过将问题分解为多个子问题,并利用已解决子问题的解来求解更大规模的问题。

其核心思想是利用存储技术来避免重复计算,从而大大提高计算效率。

具体来说,动态规划算法通常包含以下步骤:1. 定义子问题:将原问题分解为若干个子问题,这些子问题具有相同的结构,但规模更小。

这种分解可以通过递归的方式进行。

2. 定义状态:确定每个子问题的独立变量,即问题的状态。

状态具有明确的定义和可计算的表达式。

3. 确定状态转移方程:根据子问题之间的关系,建立状态之间的转移方程。

这个方程可以是简单的递推关系式、递归方程或其他形式的方程。

4. 解决问题:使用递推或其他方法,根据状态转移方程求解每个子问题,直到获得最终解。

三、动态规划的使用案例1. 背包问题背包问题是动态规划算法的经典案例之一。

假设有一个背包,它能容纳一定重量的物品,每个物品有对应的价值。

目的是在不超过背包总重量的前提下,选取最有价值的物品装入背包。

这个问题可以通过动态规划算法来求解。

具体步骤如下:(1)定义问题:在不超过背包容量的限制下,选取物品使得总价值最大化。

(2)定义状态:令dp[i][j]表示将前i个物品放入容量为j的背包中所能获得的最大价值。

(3)状态转移方程:dp[i][j] = max(dp[i-1][j-w[i]]+v[i], dp[i-1][j]),其中w[i]为第i个物品的重量,v[i]为第i个物品的价值。

(4)解决问题:根据状态转移方程依次计算每个子问题的解,并记录最优解,直到获得最终答案。

2. 最长公共子序列最长公共子序列(Longest Common Subsequence,简称LCS)是一种经典的动态规划问题,它用于确定两个字符串中最长的共同子序列。

动态规划 运筹学 例题

动态规划 运筹学 例题

动态规划运筹学例题动态规划是运筹学中常用的一种优化技术,它利用规划、三角函数和其他数学技术来解决日常生活中的各种问题,比如最优路线问题、最优资源分配问题、最优出行路线问题等。

本文将通过一个例题,来介绍动态规划的基本思想,以及如何利用动态规划来解决问题。

例题一:已知一条路线,由A点到B点,有N个途经的节点,每个节点之间的距离已知。

求从A到B的最短路线。

按照动态规划的思想,首先将该问题分解为若干个子问题,并根据子问题的解来解决原问题,这种分解和解决问题的方式称为动态规划。

对于上面的问题,可以将其分解为N个子问题,分别是从A到第1个节点、从第1个节点到第2个节点、从第2个节点到第3个节点,以此类推,最后一个子问题是从第N-1个节点到B点的最短路程。

将上面的N个子问题中,从第i个节点到B点的最短路程记为d[i],由于从第i个节点到B点可能经过i+1、i+2、……、N-1节点,因此要找到d[i],只需要找到经过i+1、i+2、……、N-1节点的最短路程即可,即求d[i]=Min{d[i+1]+length[i][i+1],d[i+2]+length[i][i+2],…,d[N-1]+length[i][N-1]},其中length[i][j]是第i个节点到第j个节点的距离。

以上就是动态规划的解题步骤,它能将原问题分解成若干个子问题,并找到最优解。

对于本例来说,通过上述步骤,就可以得到从A 到B的最短路程。

这种分解和求解问题的方法是动态规划,可以用来解决许多类似的问题,如:1)最优路线问题;2)旅行推销员问题;3)硬币找零问题。

动态规划的一大特点是,他能很好地将问题分解为多个子问题,并能从子问题的解中求解出最优解。

总之,动态规划是一种很有用的优化技术,它可以有效解决各种运筹学问题。

它不仅可以帮助我们解决许多具体问题,而且还能使我们更好地理解问题及其解法。

动态规划算法详解及经典例题

动态规划算法详解及经典例题

动态规划算法详解及经典例题⼀、基本概念(1)⼀种使⽤多阶段决策过程最优的通⽤⽅法。

(2)动态规划过程是:每次决策依赖于当前状态,⼜随即引起状态的转移。

⼀个决策序列就是在变化的状态中产⽣出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。

假设问题是由交叠的⼦问题所构成,我们就能够⽤动态规划技术来解决它。

⼀般来说,这种⼦问题出⾃对给定问题求解的递推关系中,这个递推关系包括了同样问题的更⼩⼦问题的解。

动态规划法建议,与其对交叠⼦问题⼀次重新的求解,不如把每⼀个较⼩⼦问题仅仅求解⼀次并把结果记录在表中(动态规划也是空间换时间的)。

这样就能够从表中得到原始问题的解。

(3)动态规划经常常使⽤于解决最优化问题,这些问题多表现为多阶段决策。

关于多阶段决策:在实际中,⼈们经常遇到这样⼀类决策问题,即因为过程的特殊性,能够将决策的全过程根据时间或空间划分若⼲个联系的阶段。

⽽在各阶段中。

⼈们都须要作出⽅案的选择。

我们称之为决策。

⽽且当⼀个阶段的决策之后,经常影响到下⼀个阶段的决策,从⽽影响整个过程的活动。

这样,各个阶段所确定的决策就构成⼀个决策序列,常称之为策略。

因为各个阶段可供选择的决策往往不⽌⼀个。

因⽽就可能有很多决策以供选择,这些可供选择的策略构成⼀个集合,我们称之为同意策略集合(简称策略集合)。

每⼀个策略都对应地确定⼀种活动的效果。

我们假定这个效果能够⽤数量来衡量。

因为不同的策略经常导致不同的效果,因此,怎样在同意策略集合中选择⼀个策略,使其在预定的标准下达到最好的效果。

经常是⼈们所关⼼的问题。

我们称这种策略为最优策略,这类问题就称为多阶段决策问题。

(4)多阶段决策问题举例:机器负荷分配问题某种机器能够在⾼低两种不同的负荷下进⾏⽣产。

在⾼负荷下⽣产时。

产品的年产量g和投⼊⽣产的机器数量x的关系为g=g(x),这时的年完善率为a,即假设年初完善机器数为x,到年终时完善的机器数为a*x(0<a<1);在低负荷下⽣产时,产品的年产量h和投⼊⽣产的机器数量y 的关系为h=h(y)。

动态规划-例题众多-详细讲解

动态规划-例题众多-详细讲解

步骤2:状态转移方程:
步骤3:以自底向上的方法来计算最优解
12
程序的实现
BuyTicks(T, R)
1 n ← length[T]
2 f[0] ← 0
3 f[1] ← T[1]
4 for i ← 2 to n do
5
f[i] ← f[i-2]+R[i-1]
6
if f[i] > f[i-1]+T[i] then
n 0 1 2 3 4 5 6 7 8 9 10 F(n) 1 1 2 3 5 8 13 21 34 55 89
2
递归 vs 动态规划
递归版本:
F(n)
1 if n=0 or n=1 then
2
return 1
3 else
4
return F(n-1) + F(n-2)
太慢!
动态规划:
F(n)
1 A[0] = A[1] ← 1
这里是某支股票的价格清单: 日期 1 2 3 4 5 6 7 8 9 10 11 12 价格 68 69 54 64 68 64 70 67 78 62 98 87 最优秀的投资者可以购买最多4次股票,可行方案中的一种是: 日期 2 5 6 10 价格 69 68 64 62 输入 第1行: N (1 <= N <= 5000),股票发行天数 第2行: N个数,是每天的股票价格。 输出 输出文件仅一行包含两个数:最大购买次数和拥有最大购买次数的方案数(<=231) 当二种方案“看起来一样”时(就是说它们构成的价格队列一样的时候),这2种方 案被认为是相同的。
你的任务是,已知所有N位同学的身高,计算最少需要 几位同学出列,可以使得剩下的同学排成合唱队形。

动态规划练习题及解答1

动态规划练习题及解答1

动态规划练习题[题1] 多米诺骨牌(DOMINO)问题描述:有一种多米诺骨牌是平面的,其正面被分成上下两部分,每一部分的表面或者为空,或者被标上1至6个点。

现有一行排列在桌面上:顶行骨牌的点数之和为6+1+1+1=9;底行骨牌点数之和为1+5+3+2=11。

顶行和底行的差值是2。

这个差值是两行点数之和的差的绝对值。

每个多米诺骨牌都可以上下倒置转换,即上部变为下部,下部变为上部。

现在的任务是,以最少的翻转次数,使得顶行和底行之间的差值最小。

对于上面这个例子,我们只需翻转最后一个骨牌,就可以使得顶行和底行的差值为0,所以例子的答案为1。

输入格式:文件的第一行是一个整数n(1〈=n〈=1000〉,表示有n个多米诺骨牌在桌面上排成一行。

接下来共有n行,每行包含两个整数a、b(0〈=a、b〈=6,中间用空格分开〉。

第I+1行的a、b分别表示第I个多米诺骨牌的上部与下部的点数(0表示空)。

输出格式:只有一个整数在文件的第一行。

这个整数表示翻动骨牌的最少次数,从而使得顶行和底行的差值最小。

[题2] Perform巡回演出题目描述:Flute市的Phlharmoniker乐团2000年准备到Harp市做一次大型演出,本着普及古典音乐的目的,乐团指挥L.Y.M准备在到达Harp市之前先在周围一些小城市作一段时间的巡回演出,此后的几天里,音乐家们将每天搭乘一个航班从一个城市飞到另一个城市,最后才到达目的地Harp市(乐团可多次在同一城市演出).由于航线的费用和班次每天都在变,城市和城市之间都有一份循环的航班表,每一时间,每一方向,航班表循环的周期都可能不同.现要求寻找一张花费费用最小的演出表.输入: 输入文件包括若干个场景.每个场景的描述由一对整数n(2<=n<=10)和k(1<=k<=1000)开始,音乐家们要在这n个城市作巡回演出,城市用1..n标号,其中1是起点Flute市,n是终点Harp市,接下来有n*(n-1)份航班表,一份航班表一行,描述每对城市之间的航线和价格,第一组n-1份航班表对应从城市1到其他城市(2,3,...n)的航班,接下的n-1行是从城市2到其他城市(1,3,4...n)的航班,如此下去.每份航班又一个整数d(1<=d<=30)开始,表示航班表循环的周期,接下来的d个非负整数表示1,2...d天对应的两个城市的航班的价格,价格为零表示那天两个城市之间没有航班.例如"3 75 0 80"表示第一天机票价格是75KOI,第二天没有航班,第三天的机票是80KOI,然后循环:第四天又是75KOI,第五天没有航班,如此循环.输入文件由n=k=0的场景结束.输出:对每个场景如果乐团可能从城市1出发,每天都要飞往另一个城市,最后(经过k天)抵达城市n,则输出这k个航班价格之和的最小值.如果不可能存在这样的巡回演出路线,输出0.样例输入: 样例输出:3 6 4602 130 150 03 75 0 807 120 110 0 100 110 120 04 60 70 60 503 0 135 1402 70 802 32 0 701 800 0[题3] 复制书稿(BOOKS)问题描述:假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。

floyd算法例题 a1 a2 a3 a4

floyd算法例题 a1 a2 a3 a4

Floyd算法是一种用来寻找图中所有节点对之间最短路径的算法,它的核心思想是动态规划。

Floyd算法的基本原理是:假设图中有n个节点,将所有节点对之间的最短路径长度初始化为它们之间的直接连线长度,然后逐步更新这些距离,直到得到所有节点对之间的最短路径。

在本文中,我们将通过四个例题a1、a2、a3、a4来讲解Floyd算法的具体应用,以帮助读者更好地理解和掌握这一算法。

1. 例题a1【题目】有一个带权有向图,节点数为n,边数为m,求图中任意两点之间的最短路径长度。

【输入】第一行为两个整数n和m,分别表示节点数和边数。

接下来m行,每行包含三个整数a、b、c,表示图中存在一条从节点a到节点b的有向边,边的权值为c。

【输出】输出一个n×n的矩阵,其中第i行第j列的元素表示节点i到节点j的最短路径长度。

如果两点之间不存在路径,则输出一个特定的值(例如9999)。

【样例】输入:5 71 2 21 3 32 3 22 4 53 4 13 5 64 5 3输出:0 2 3 7 99999 0 2 5 89999 9999 0 3 69999 9999 9999 0 39999 9999 9999 9999 0【分析】根据给定的图和节点数,首先初始化一个n×n的矩阵,然后将直接连线的路径长度填入矩阵中。

接下来,利用Floyd算法逐步更新矩阵中的最短路径长度,直到得到所有节点对之间的最短路径长度。

2. 例题a2【题目】有一个带权有向图,节点数为n,边数为m,求图中是否存在负权环。

【输入】第一行为两个整数n和m,分别表示节点数和边数。

接下来m行,每行包含三个整数a、b、c,表示图中存在一条从节点a到节点b的有向边,边的权值为c。

【输出】若存在负权环,则输出"存在负权环",否则输出"不存在负权环"。

【样例】输入:3 31 2 -12 3 -23 1 -3输出:存在负权环【分析】我们可以利用Floyd算法求出图中任意两点之间的最短路径长度,然后再验证是否存在负权环。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
样例: INPUT 389 207 155 300 299 170 158 65
OUTPUT 6(最多能拦截的导弹数) 2(要拦截所有导弹最少要配备的系统数)
15
拓展2:低价购买
“低价购买”这条建议是在奶牛股票市场取得成功的一半规则。要想被认为是伟 大的投资者,你必须遵循以下的问题建议:“低价购买;再低价购买”。每次你购买 一支股票,你必须用低于你上次购买它的价格购买它。买的次数越多越好!你的目标 是在遵循以上建议的前提下,求你最多能购买股票的次数。你将被给出一段时间内 一支股票每天的出售价(216范围内的正整数),你可以选择在哪些天购买这支股票。 每次购买都必须遵循“低价购买;再低价购买”的原则。写一个程序计算最大购买 次数。 这里是某支股票的价格清单: 日期 1 2 3 4 5 6 7 8 9 10 11 12 价格 68 69 54 64 68 64 70 67 78 62 98 87 最优秀的投资者可以购买最多4次股票,可行方案中的一种是: 日期 2 5 6 10 价格 69 68 64 62 输入 第1行: N (1 <= N <= 5000),股票发行天数 第2行: N个数,是每天的股票价格。 输出 输出文件仅一行包含两个数:最大购买次数和拥有最大购买次数的方案数(<=231) 当二种方案“看起来一样”时(就是说它们构成的价格队列一样的时候),这2种方 案被认为是相同的。 16
动态规划
参与竞赛的同学应由竞争关系和独立关系 (你做你的,我干我的,程序和算法互相 保密,彼此津津乐道于对方的失败和自己 的成功)转向合作学习的关系(通过研讨 算法、集中编程、互测数据等互相合作的 方式完成学习任务)
斐波纳契数列F(n)
F(n) =
n 0
1 F(n-1) + F(n-2)
1 1 2 2 3 3 4 5 5
19
例题六:数字三角形问题
1.问题描述 设有一个三角形的数塔,顶点结点称为根结点,每个结点有一个整数数值。 从顶点出发,可以向左走,也可以向右走。如图10一1所示。
问题:当三角形数塔给出之后,找出一条从第一层到达底层的路径,使路径的 值最大。若这样的路径存在多条,任意给出D(X,y)表示从顶层到达第 X层第y个位置的最小路径得分。
太慢!
有效率! 算法复杂度是 O(n)
3
方法概要



构造一个公式,它表示一个问题的解是与它的子问题的 解相关的公式. E.g. F(n) = F(n-1) + F(n-2). 为这些子问题做索引 ,以便它们能够在表中更好的存储 与检索 (i.e., 数组array【】) 以自底向上的方法来填写这表格; 首先填写最小子问题 的解. 这就保证了当我们解决一个特殊的子问题时, 可以利 用比它更小的所有可利用的 子问题的解.
宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n 。 现在可以进行两种操作, 1.将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的push操作) 2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的pop操作)
22
使用这两种操作,由一个操作数序列就可以得到一系列的输出 序列,下图所示为由1 2 3生成序列2 3 1的过程。(原始状态如 上图所示)
2
3
3
2
3
2 1 2 2 3 1 2 3 1
1
23
你的程序将对给定的n,计算并输出由操作数序列1,2,…,n经过操 作可能得到的输出序列的总数。
棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为 不超过 20 的整数,并由键盘输入),同样马的位置坐标 是需要给出的(约定: C<>A,同时C<>B)。现在要求 你计算出卒从 A 点能够到达 B 点的路径的条数。 [输入]: 键盘输入 B点的坐标(n,m)以及对方马的坐标(X,Y){不用盘错} [输出]: 屏幕输出 一个整数(路径的条数)。 [输入输出样例]: 输入: 6632 输出: 17
i
步骤2:状态转移方程:
步骤3:以自底向上的方法来计算最优解
12
程序的实现
BuyTicks(T, R) 1 n ← length[T] 2 f[0] ← 0 3 f[1] ← T[1] 4 for i ← 2 to n do 5 f[i] ← f[i-2]+R[i-1] 6 if f[i] > f[i-1]+T[i] then 7 f[i] ← f[i-1]+T[i] 8 return f
步骤1:用F(i)表示第i项到最后一项最长不下降序列的长度的值; 步骤2:状态转移方程;
d[i]表示数列中第i项的值;
步骤3:以自底向上的 方法来计算最优解
14
拓展1: 拦截导弹 (vijos1303)
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系 统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都 不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用 阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数), 计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导 弹拦截系统。
if n = 0 or 1 if n > 1
6 7 8 9 10
F(n) 1
8 13 21 34 55 89
2
递归 vs 动态规划
递归版本: F(n) 1 if n=0 or n=1 then 2 return 1 3 else 4 return F(n-1) + F(n-2)
动态规划: F(n) 1 A[0] = A[1] ← 1 2 for i ← 2 to n do 3 A[i] ← A[i-1] + A[i-2] 4 return A[n]
5


最优子结构性质:问题的最优解包含着它 的子问题的最优解。即不管前面的策略如 何,此后的决策必须是基于当前状态(由 上一次决策产生)的最优决策。 重叠子问题:在用递归算法自顶向下解问 题时,每次产生的子问题并不总是新问题, 有些问题被反复计算多次。对每个子问题 只解一次,然后将其解保存起来,以后再 遇到同样的问题时就可以直接引用,不必 重新求解。
拓展3:合唱队形 (vijis1098)
N位同学站成一排,音乐老师要请其中的(N-K)位同学出 列,使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形:设K位同学从左到右依 次编号为1,2…,K,他们的身高分别为T1,T2,…,TK , 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。 你的任务是,已知所有N位同学的身高,计算最少需要 几位同学出列,可以使得剩下的同学排成合唱队形。
6
动态规划
解决问题的基本特征
1. 动态规划一般解决最值(最优,最 大,最小,最长……)问题; 2. 动态规划解决的问题一般是离散 的,可以分解(划分阶段)的; 3. 动态规划解决的问题必须包含最 优子结构,即可以由(n-1)的最 优推导出n的最优
7
解决问题的基本步骤

动态规划算法的4个步骤: 1. 刻画最优解的结构特性. (一维,二维, 三维数组) 2. 递归的定义最优解. (状态转移方程) 3. 以自底向上的方法来计算最优解. 4. 从计算得到的解来构造一个最优解.
11
分析:
1
2
如果前i个人买票的最优买票方式一确定, 比如第i-1个人买一张票,则前i-1个人的 买票方式也一定是最优的。即问题的最 优解包含子问题的最优解。

3
4
5
i… n-2 n-1
步骤1:用F(i)表示前i个人买票的最优方 式,即所需最短时间;现在要决定F(i)需要 考虑两种情况:
n min (1)第i个人的票自己买 (2)第i个人的票由第i-1个人买
8
例题一. 斐波纳契数列F(n)
步骤1:用F(n)表示在斐波纳契数列中第n个数的值; 步骤2:状态转移方程:
F(n) =
1 F(n-1) + F(n-2)
if n = 0 or 1 if n > 1
步骤3:以自底向上的方法来计算最优解
n F(n)
0 1
1 1
2 2
3 3
4 5
5 8
6 7 8 9 10 13 21 34 55 89
输入的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n 个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高( 厘米)。 输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。 样例输入 8 186 186 150 200 160 130 197 220 样例输出: 4
步骤4:在数组中分析构造出问题的解;
9
例题二. 输入n,求出n!
步骤1:用F(n)表示n!的值; 步骤2:状态转移方程:
F(n) =
1 F(n-1) *n
if n = 0 or 1 if n > 1
步骤3:以自底向上的方法来计算最优解
n F(n)
0 1
1 1
2 2
3 6
4 24
5
6
7
8
9
10
120 720
由于历史原因, 我们称这种方法为: 动态规划.
在上世纪40年代末 (计算机普及很少时), 这些规划设计是与”列表“方法相关的.
4
动态规划算法



算法思想 将待求解的问题分解成若干个子问题,并 存储子问题的解而避免计算重复的子问题, 并由子问题的解得到原问题的解。 动态规划算法通常用于求解具有某种最优 性质的问题。 动态规划算法的基本要素: 最优子结构性质和重叠子问题。
相关文档
最新文档