(一) POJ1088,动态规划的入门级题目。嘿嘿,连题目描述都是难得一见的中文。
题目分析:
求最长的滑雪路径,关键是确定起点,即从哪开始滑。
不妨设以( i, j )为起点,现在求滑行的最长路径。
首先,( i, j )能滑向的无非就是它四周比它低的点。到底滑向哪个点?很简单,谁长滑行谁。假设(i, j )--->( i, j+1 ), 现在就变成了:以( i, j+1 )为起点,求最长滑行路径的问题。这样一直下去,直到某个局部最低点,就算滑行结束了。
状态转换方程:
dp( i,j ) = Max( dp( i-1, j ), dp( i, j+1 ),dp( i+1, j ), dp( i, j-1 ) ) + 1;
其中:dp( i,j )表示以( i, j )为起点,所能滑行的最长长度
编程实现:
枚举起点,找到最长的滑行路径。因为涉及到上下左右的点,所以注意边界情况的处理。还是记忆化递归来的简便,直接把Invalid的情况给剪掉。
(二) POJ1163,DP的入门级题目。和上面的POJ1088有些相似,也可以看成从上往下滑。不过起点是确定的,只能( 1, 1 )开始。
题目分析:
要使和最大,关键是确定终点。不妨设以( i, j )为起点,现在求滑行的最长路径。
如果( i, j )为终点,则前一个点只可能是( i-1, j-1 )或者( i-1, j )。选择的标准,还是看哪个点更优。如果假设( i, j )--->( i-1, j-1 ),则问题又变成了:以( i-1, j-1 )为终点求最大和的问题。
状态转换方程:
dp( i,j ) = Max( dp( i-1, j-1 ), dp( i-1, j) ) + data[i][j];
其中:dp( i,j )表示以( i, j )为终点,所得到的最大和。
data[i][j]表示三角矩阵中第i行第j列的值
编程实现:
同样,要注意三角矩阵的边界。边界的有些点不能用状态方程就去。如图2所示,(3,1)和(3,3)要单独处理。
(三) POJ1050,动态规划必做题目,经典程度五颗星。这个题目的前身就是&