算法导论第15章 动态规划

本文深入探讨动态规划的概念,强调子问题重叠和最优子结构的特点。介绍了15.1钢条切割问题,通过优化避免重复计算,将时间复杂度从O(2^n)降低到O(n^2)。15.2部分涉及矩阵链乘法,结合链接详细阐述解题策略。最后,总结动态规划的基本原理,包括自顶向下和自底向上的算法设计思路。
摘要由CSDN通过智能技术生成

动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题。

动态规划的重点在于用表存储子子问题的解,使得每个子子问题只用求解一次,避免重复计算。(空间换时间)

动态规划通常用来求解最优化问题

动态规划两个特征

1.子问题重叠

2.最优子结构

 

四个步骤来设计一个动态规划算法

1.刻画一个最优解的结构特征(寻找最优子结构,然后利用这种子结构从子问题的最优解构造出原问题的最优解)

2.递归的定义最优解的值

3.计算最优解的值,通常采用自底而上的方法

4.利用计算出的信息构造最优解

LeetCode的最长回文子串问题就是用到了动态规划

15.1钢条切割问题

给定一段长度为n英寸的钢条和一个不同长度钢条价目表pi(i=1,2,...,n)求切割方案

最优解是把可以迭代原钢条切成两段的最大值来做到,但是如果可以把一段钢条切割最大值存起来,下次调用它的时候就不用再迭代了。时间复杂度就从O(2^n)变为O(n^2)。

钢条切割问题满足最优子结构性质:问题最优解由相关子问题的最优解构成,而这些子问题可以单独求解。

提到这点是因为有时最优解不是由相关子问题的最优解构成。

以下是解决这个问题的代码:允许设置钢条切割费用,返回割切后各钢条长度

package cutSteel;
import java.util.*;
public class cutSteel {
	public static void main(String[] args) {
		int steelLength = 15;//steelLength为原钢条长度
		int cutPay =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值