超级传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=2571
题目大意:
有个地图,是二维的矩阵,矩阵里面的数值是幸运值K(K可以取负数,( |K|<100 ))
yifenfei(人名) 要从(1,1) 走到(n,m),求路过幸运值K的和最大是多少。
yifenfei在(x,y)可以走到(x+1,y),(x,y+1) 或者 (x,y*k) 其中k>1。
题目分析:
yifenfei在(x,y)可以走到(x+1,y),(x,y+1) 或者 (x,y*k) 其中k>1。 前面不影响后面,是一个很典型的DP。
既然是DP,就先分析一下转换方程:
假设小Y在(i,j) ,则上一步就是在(i-1,j) 或者(i,j-1) 或者 (i,j / k)(其中j % k ==0 && k != 1)
所以转换方程也就很容易出来了 f(i,j) = max( f(i-1,j) , f(i,j-1),f(i,j / k)(其中 j % k ==0 && k != 1) )
方程得到以后,就是确定边界条件:
这时候不得不关注到 幸运值K(K可以取负数,( |K|<100 )) 所以边界不能取0,我们把边界定为非常小,这样就保证转换方程就不会越界了
私人觉得DP的题目最好还是从1开始记录,0留空当边界,相对比较好处理
而且很容易发现 : 竖边界每个点只能从正上方下来 也就是:f[ i][ 1 ] = f[ i- 1 ][ 1 ] + p[ i][ 1 ];(p是(i,j)的幸运值K)
而横边界就是非常小
把这些都分析清楚了那么代码就很好写了
下面是整体AC的代码: