算法—动态规划学习笔记(1)入门
说实在的,搞算法以来,动态规划给我的感觉就像是高中数学倒数第三和第二道压轴题——老师讲了n多遍,你也知道要考啥(圆锥曲线和导数),基本原理也都懂。但是一到考试,只要稍稍变形,就不会了(说的就是本蒟蒻了,高考数学123,两道压轴题基本是空白)。
动态规划到底是什么
先来看一下百度百科的定义:
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。
也就是说,从本质上说,动态规划是一种数学统筹方法。不过由于易于用程序实现,且经常与其他算法问题相结合,因此也作为计算机算法分析与设计的一个主要内容。
那么,为什么叫动态规划呢?
规划的话,好理解,即对一个问题求最优解;那么动态呢?意思是这个问题中会有很多个转态,其中一个状态下便是整个问题的最优解。
动态规划的求解步骤
总得来说,动态规划分为三个步骤(当然也有人说四个步骤,且每个步骤说法都不一定一致):
1)阶段划分;
2)找出状态转移方程;
3)求解最优解。
是不是感觉说了通废话?确实如此,毕竟还没写代码不是吗?现在就以一个经典、简单的dp问题来入门:
问题(1)Coin-row Problem
There is a row of n coins whose values are some positive integers c₁, c₂,…,cn, not necessarily distinct. The goal is to pick up the maximum amount of money subject to the constraint that no two coins adjacent in the initial row can be picked up.
描述:有n个硬币&