对动态规划(dp)的一点理解

本文介绍了动态规划(DP)的核心思想,包括一空间换时间、最优子结构、重叠子问题和无后效性,并概述了解决DP问题的一般步骤。通过分析最优解结构、递归定义、自底向上计算和状态确定,阐述了DP在ACM中的应用,强调了状态转移方程、递推方向和空间优化的重要性。动态规划是一种强大的算法,需要通过大量练习提高对它的理解和应用能力。

暑假实验室搞集训,实验室安排我们几个大二的(准大三)学长分别讲点东西。我就被分到讲dp;忽然发现,搞ACM也有1年多了,好像都没有好好的总结一下dp。就想说说我自己对dp的理解。

dp其实是一种思想,而不是一种算法。它的核心就是一空间换时间。通过对所有状态的最优解的记录,再通过某种递推关系,得到最终解。用查询的方式代替重新计算,从而降低时间复杂度。说到时间复杂度,dp的时间复杂度有一个统一的表示:状态数*得到每个状态最优解的时间。由于这些核心的思想,决定了dp的题目应该具备一些特征:

1、最优子结构:最优子结构就是局部最优能够决定整体最优。即:我们要解决的一个困难的大问题,能够划分成一个个容易解决小问题,通过解决这些小问题,和这些小问题与大问题的某种递推关系,得到大问题的解。

2、重叠子问题:这个是dp能过降低时间复杂度的原因。意思就是,在解决一个大问题的过程中,需要多次解决某个小问题。由于我们已经把小问题的解计算出来,并存在内存中,所以在需要用到的时候直接取出来就行。不需要再去计算,这样就能降低时间复杂度,空间换时间。

3、无后效性:我刚开始看到这个名次的时间是在《算法艺术与信息学竞赛》这本书上。我看了好久都没有明白,其实它的意思也很好理解。就是说当前要解决的子问题,只与前面比这个问题小的问题有关,对后来要解决的大问题没有影响。并且大问题只关心的是小问题的最优解,至于最优解是怎么来的,对大问题都没有影响。

对于dp解题的一般思考方向,也主要是从dp的思想和问题的结构开始的。《算法导论》上对此总结了dp的一般步骤:

1、描述最优解结构;

2、递归定义最优解;

3、按照自底向上的方式计算最优解的值;

4、按计算的结果构造一个最优解;

感觉着个总结还是挺好懂的,我想谈谈我自己对解决问题中的一些想法和一些注意值得注意的地方;

1、状态的确定,对于一个dp题,首要的任务就是描述问题状态,也就是最优子结构。状态的确定其实并不简单,自己感觉,正确的定义状态(最有子结构),这个dp问题就解决了一半。但是状态的确定还是有一定的思考方向的:模仿一些经典的dp问题中状态的定义;仔细分析问题,观察大问题能够怎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值