poj 1163经典DP

来源:互联网 发布:js让某个a标签隐藏掉 编辑:程序博客网 时间:2024/04/28 10:30

 DP(Dinamic Programming),即为动态规划。
    应该来说DP算法在ACM中是比较常见,也是比较难的,当然,做多了就不觉得难了,这是一条亘古不变的自然规律。以前在做ACM题的时候,凡是看到DP就跳过,似乎是一种条件反射,追溯起来,是因为之前在学算法设计课程的时候写了一个矩阵相乘的程序,用的就是动态规划,当时觉得DP好烦哪,于是黑暗的种子算是在那会种下了,这颗种子生根发芽,一直在我身上根深缔固了好几年时间,可怕~~
    终于还是忍无可忍,决定攻克DP这座碉堡。
    POJ上的1163是经典的动态规划题,就从这道题开始吧。这道题的题意比较简单,先看下图(图1,最多100层,最少1层),找一条和最大的路径,下图满足条件的路径是:7->3->8->7->5,和为30,最后输出该路径所有值的和。

     7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(图1)
咋一看,这不就是求最优解嘛。可要怎么实现呢?
看似非常简单的一道题,可如果不知道DP算法,却也并不见得多简单。好了,既然是要用到动态规划算法,
还是先作一个简单的介绍吧。DP是求解最优化问题的一种方法,既然是最优,当然就有多个状态的比较,这样才能
体现出“最优”嘛。所以在DP算法中必须记录每一次操作的状态再进行决策,这称为多阶段决策问题:问题可以
按时间顺序分解成若干相互联系的阶段,在每一个阶段都要做出决策,全部过程的决策是一个决策序列。要使整个
活动的总体效果达到最优的问题,称为多阶段决策问题。根据过程的时间变量是离散的还是连续的,分为离散时间
决策过程(discrete-time decision process)
,即多阶段决策过程和连续时间决策过程(continuous-time decision
process)
;根据过程的演变是确定的还是随机的,分为确定性决策过程(deterministic decision process)随机性
决策过程(stochastic decision process)
,其中应用最广的是确定性多阶段决策过程。
好了,从上面的描述中,我们大概得出了DP中的一些关键子:最优,阶段,状态,决策。DP正是在不同阶段作出决策
以达到最优解的一个过程。
还是来看题吧,用实际例子来进一步说明动态规划。上题中,我们以一个数组来记录状态,自下而上进行分析,为
什么是自下而上,而不是自上而下呢?如果是从上往下,在操作的时候无法预知后面数据,根本没有办法作出最优的
决策,而且数据越来越多,规模越来越大,不好控制;而从下往上则正好相反。
看看下面的代码相信就很容易理解了:
 
http://poj.grids.cn/problem/1163