文章目录
一、前言
动态规划(Dynamic Programming)是一种系统思维,如果挑着看会觉得很难,因为变种太多,比如背包问题、状态压缩DP、线性DP、树形DP、区间DP、斜率DP、插头DP,但是核心思路是一样的,就是设计出合理的状态和状态转移方程,从而通过迭代或者递归的方式求出最终问题的解。
为了更加系统的讲解动态规划,作者整理了一些以前记录的笔记,从最简单的 0/1 背包问题开始讲起,将状态和状态转移的的概念分析透彻后,再由浅入深,进军更加复杂的动态规划问题。
学习动态规划的时候,感触最深的就是:“哇靠!这怎么能想到的?” ,动态规划的问题编码也许很简单,但是状态的设计可能要想半天,一旦想出来了,就会有一种醍醐灌顶的感觉,这或许就是它的魅力所在吧。
二、0/1 背包问题
【例题1】有 n ( n ≤ 100 ) n(n \le100)