动态规划
动态规划是利用之前所计算的最优值来推出接下来问题的最优值。
有些像递归。
解题要先定义储存每个问题最优值的数组,然后找到最优值的状态转移方程,还要找到最初的初始值。
拿一个简单的题举例:
小明写了一个简单的吃金币游戏,规则如下:
在一个长方形地图上,玩家每次能从一个方格走到相邻一个方格。
玩家控制的角色可以向下或者向右走,但不能向上或向左走。每个方格上都有一定的金币。
现在,小明想请你帮他想一个策略,尽可能多的获得金币(从左上角走到右下角可能获得的最大金币数)。
该问题是求到右下角是所获得金币的最大值。而右下角只能通过它的上边或左边到达,并且每个格子都有这样的性质(有到该格获得的金币数最大值,只能从上边或左边到达),那么可以定义一个存储到达每个格子所能获得的金币数最大值的数组f[n][m]。每个格子都是由上边或者左边的格子的最优值加上本身值来构成自身的最优值。且左上角的最优值为其本身。
那么我们便获得了
储存每个问题最优值的数组,
最优值的状态转移方程,
以及最初的初始值。
如此问题便基本解决了,剩下就是用代码翻译了。
感悟:
想要真正了解动态规划,光是做几道题是完全不够的,需要大量的题来了解动态规划。并且还要以此提高自己的思维能力,否则就算看懂了所有做过的题,在遇到新题是还是会很难找到状态转移方程,就像学数学一样。要想解决这样的问题,那就要多思考了,对每个问题都尽可能自己思考,最好多看看能提高思维能力的书,这样持之以恒下去,总是能够有所收获的。