算法之动态规划 之 子问题重叠和最优子结构

动态规划解析:子问题重叠与最优子结构
本文介绍了动态规划在解决最优化问题中的应用,重点讨论了子问题重叠和最优子结构的概念。通过装配线调度问题和矩阵链乘法两个实例,详细阐述了解决这类问题的四个步骤:描述最优解的结构、递归定义最优解的值、自底向上计算最优解的值以及构造最优解。动态规划的关键在于存储子问题的解,以避免重复计算。
最优化问题,即要做出一组选择以达到一个最优解。在做选择的同时,经常出现同样形式的子问题。当某一特定子问题可能出自多于一种选择的集合时,动态规划就很有效。关键技术是存储这些子问题的每一个解,以备它重复出现。
与分治法不同的是,动态规划面对的子问题并不是相互独立的,各子问题有可能包含公共的子子问题。
1)描述最优解的结构
2)递归定义最优解的值
3)按自底向上的方式计算最优解的值。
4)由计算出的结果构造一个最优解。

- 子问题重叠
- 最优子结构

1 装配线调度问题
给出两条装配线,每条n个装配站,装配时间都不相同,如果要把装配到一半的移到另外一条线上需要时间代价t。
问最短装配时间和最短装配路径。
步骤1:通过工厂最快路线的结构
对两条装配线的任一条来说:一条通过j站的最短路径,必然通过j-1站或是另一条线的j-1站加上转线代价。所以就分解成了两个子问题的最优解问题。

步骤2:一个递归的解
首先找到起始位置,也就是底,
f1[1] = e1 + a1,1
f2[1] = e2 + a2,1
f1[j] = min(f1[j-1] + a1,j , f2[j-1] + t2,j-1 + a1,j)
f2[j] = min(f2[j-1] + a2,j , f1[j-1] + t1,j-1 + a2,j)
而f* = min(f1[n] + x1, f2[n] + x2)

Description 在讲动态规划课时,我们知道可用动态规划算法求解问题应具备的一个基本要素是子问题重叠性质,矩阵连乘问题能用动态规划求解正是因为它具有重叠子问题。因此在解矩阵连乘问题的自顶向下的递归算法中,存在着大量的重叠子问题计算。例如要计算4个矩阵A1A2A3A4最小连乘次数,要分别计算A1(A2A3A4)、(A1A2)(A3A4)(A1A2A3)A4三种情况下的最小连乘次数,而计算A1(A2A3A4)的最小连乘次数要计算其子问题A2A3A4的最小连乘次数,A2A3A4最小连乘次数的计算有二种情况(A2A3)A4A2(A3A4),它分别包括求A2A3A3A4两个子问题。同理,计算(A1A2)(A3A4)包含A1A2A3A4两个子问题;计算(A1A2A3)A4包含计算A1A2A3、A1A2A2A3这三个子问题。故在解A1A2A3A4的最小连乘次数时,其子问题的计算重叠次数分别是: A1A2计算2次,重叠1次;A2A3计算2次,重叠1次;A3A4计算2次,重叠1次;A1A2A3只计算1次;A2A3A4只计算1次;A1A2A3A4只计算1次。因此,4个矩阵A1A2A3A4连乘的重叠子问题分别为:A1A2、A2A3A3A4的计算各重叠一次。现在你的编程任务是:对于n个矩阵连乘,求其重叠子问题的计算次数。 Input 第一行是1个整数n(2≤n≤300),表示有n个矩阵连乘,接下来一行有n+1个数,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开. Output 输出重叠子问题计算次数对应的子问题,中间以空格隔开,各子问题重叠次数输出分别以A1、A2、… An打头的次序依次输出,格式如样例所示。如没有重叠子问题输出NO Sample Input 4 30 35 15 5 10 Sample Output 1 A1A2 1 A2A3 1 A3A4
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值