动态规划解题的一般思路

*  许多求最优解的问题可以用动态规划来解决。

*  首先要把原问题分解为若干个子问题。注意单纯的递归往往会导致子问题被重复计算,用动态规划的方法,子问题的解一旦求出就要被保存,所以每个子问题只需求解一次。

*  子问题经常和原问题形式相似,有时甚至完全一样,只不过规模从原来的n 变成了n-1,或从原来的n×m 变成了n×(m-1) ……等等。

*  找到子问题,就意味着找到了将整个问题逐渐分解的办法。

*  分解下去,直到最底层规模最小的的子问题可以一目了然地看出解。

*  每一层子问题的解决,会导致上一层子问题的解决,逐层向上,就会导致最终整个问题的解决。

*  如果从最底层的子问题开始,自底向上地推导出一个个子问题的解,那么编程的时候就不需要写递归函数。

*  用动态规划解题时,将和子问题相关的各个变量的一组取值,称之为一个“状态”。一个“状态”对应于一个或多个子问题,所谓某个“状态”下的“值”,就是这个“状态”所对应的子问题的解。

*  比如数字三角形,子问题就是“从位于(r,j)数字开始,到底边路径的最大和”。这个子问题和两个变量r 和j 相关,那么一个“状态”,就是r, j 的一组取值,即每个数字的位置就是一个“状态”。该“状态”所对应的“值”,就是从该位置的数字开始,到底边的最佳路径上的数字之和。

*  定义出什么是“状态”,以及在该 “状态”下的“值”后,就要找出不同的状态之间如何迁移――即如何从一个或多个“值”已知的 “状态”,求出另一个“状态”的“值”。状态的迁移可以用递推公式表示,此递推公式也可被称作“状态转移方程”。

*  用动态规划解题,如何寻找“子问题”,定义“状态”,“状态转移方程”是什么样的,并没有一定之规,需要具体问题具体分析,题目做多了就会有感觉。

*  甚至,对于同一个问题,分解成子问题的办法可能不止一种,因而“状态”也可以有不同的定义方法。不同的“状态”定义方法可能会导致时间、空间效率上的区别。

时间: 2024-10-11 16:39:46

动态规划解题的一般思路的相关文章

【算法学习笔记】27.动态规划 解题报告 SJTU_OJ 1254 传手绢

1254. 传手绢 Description 活动的时候,老师经常带着同学们一起做游戏.这次,老师带着同学们一起传手绢. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着手绢,当老师吹哨子时开始传,每个同学可以把手绢传给自己左右的两个同学中的一个(左右任意),当老师在此吹哨子时,游戏停止,此时,拿着手绢的那个同学要给大家表演一个节目. abc提出一个有趣的问题:有多少种不同的传手绢方法可以使得从abc手里开始传的手绢,传了m次以后,又回到abc手里.两种传手绢方法被视作不同的方法,当

[Leetcode188] 买卖股票的最佳时机IV 动态规划 解题报告

题源:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/ 本题代码: 1 /** 2 * @author yuan 3 * @version 0.1 4 * @date 2019/4/5 5 */ 6 public class Leetcode188 { 7 8 private int getBetterBuy(int[] buy, int[] sell, int price, int i) { 9 if (i

动态规划的特征和思路

现实问题中有一类问题适宜用动态规划的思想去解决,这类问题有个显著特征就是求"最大xxx"."最小xxx",也就是求一个优化问题的解.通常这类问题都能够找到一个递归定义的递推公式,而能否高效地优雅地用动态规划解决问题的关键就在于这个递推公式的发现和定义. 尽管递推公式是按照递归的形式定义的,但实现上尽量用迭代加上一个查找表的形式实现,避免使用递归,能够显著减少代码量,从而减少出错的几率. 有两个博客不错, http://www.hawstein.com/posts/d

poj1651 最优矩阵乘法动态规划解题

题目描述: 有若干个矩阵{Ai},元素都为整数且已知矩阵大小. 如果要计算所有矩阵的乘积A1 * A2 * A3 .. Am,最少要多少次整数乘法? 输入 第一行一个整数n(n <= 100),表示一共有n-1个矩阵.第二行n个整数B1, B2, B3... Bn(Bi <= 100),第i个数Bi表示第i个矩阵的行数和第i-1个矩阵的列数.等价地,可以认为第j个矩阵Aj(1 <= j <= n - 1)的行数为Bj,列数为Bj+1. 输出 一个整数,表示最少所需的乘法次数 采用动

sicily 1176 two ends 动态规划解题

1176. Two Ends Constraints Time Limit: 1 secs, Memory Limit: 64 MB Description In the two-player game "Two Ends", an even number of cards is laid out in a row. On each card, face up, is written a positive integer. Players take turns removing a c

如何运用动态规划解题

本文内容整理自中国大学MOOC郭炜老师的程序设计与算法(二) 首先由数字三角形问题出发( ̄︶ ̄) ,题目描述如下:       7          3   8        8   1   0     2   7   4   4   4   5   2   6   5 在上面的数字三角形中寻找一条从顶部到底部的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或右下走.只需要求出这个最大和即可,不必给出具体路径.(三角形的行数大于1小于100,数字为0~99) 输入: 第一行是数

经典笔试算法题之打小怪兽

import java.util.Arrays; import java.util.Comparator; import java.util.PriorityQueue; import java.util.Scanner; /** * @author liusandao * @description * 有N只怪兽,每只怪兽有血量a[i],你有M支箭,每支箭可以造成b[i]点伤害, * 会消耗c[i]点能量.你要用箭杀死某只怪兽,该箭的伤害必须大于等于怪兽的 * 血量,打一只怪兽只能用一支箭,每

动态规划的泛式解题思路

写在前面:笔者将参加16年北大的暑期acm的集训,考虑到拿到比较好的学习效果,笔者开这个专栏用于整理一下15年集训的课件和资料.考虑到时间非常有限(一个月),加上考试缠身,很难以做到每个专题都结合例题代码,因此对于笔者比较熟悉的专题(dp.数论.组合.博弈)主要以整理思想和方法为主,对于没学过的专题以建立裸体模型为主. 利用动态规划解题的泛式思路: 1. 将原问题分解为子问题  ? 把原问题分解为若干个子问题,子问题和原问题形式相同 或类似,只不过规模变小了.子问题都解决,原问题即解 决(数字三

关于解题的思路与方法

很多学生问我这个问题,拿来一道题(或实际一个问题)解决它的思路和方法是什么. 其实人的思维是最难描述的.每个人的思考方式和习惯都不尽相同,解决同一个问题达到同一个效果的方式也是如此.简单的讲,"思路"是难以给出一个单一模式的,但是前人还是总结了很多方法.下面列出我个人比较常用的解题方法和思路,供大家参考. 博文首发地址:http://blog.csdn.net/duzixi 先说说解体思路. 解体思路有两大基本套路:一个是"自上而下",另一个是"自下而上&