在一个m行n列方格矩阵中,每一个方格内摆放着价值不等的宝贝(价值可正可负),让小明感到好奇的是,从左上角到达右下角的所有可能路线中,能捡到宝贝的价值总和最大是多少?而且这种达到最大值的路线 又有多少条?【注意:只能从一个格子向下或向右走到相邻格子,并且走到的格子宝贝一定会被捡起。】
输入格式:
第一行为整数m,n(均不大于100),下一行开始会有一个m行n列的整数方阵,对应方格矩阵中的宝贝价值(这些值的绝对值都不超过500)。
输出格式:
单独一行输出2个整数,分别为能捡到宝贝价值总和的最大值和达到最大值的路线数量,2个整数间隔一个空格。
输入样例:
4 5
2 -1 6 -2 9
-3 2 5 -5 1
5 8 3 -2 4
5 2 8 -4 7
输出样例:
26 3
分析:
DFS是显然会超时的…
因为只能向下和向右走,那么DP就很好实现了,不过要建两个DP数组,一个存放最大值,一个存放最大值的路线数。
状态转移方程:
G[i][j]:代表(i , j) 位置宝贝的价值
dp1[i][j]:代表从(1 , 1)到(i , j)的捡到宝贝最大价值和
d p 1 [ i ] [ j ] = { d p 1 [ i ] [ j − 1 ] + G [ i ] [ j ] i = 1 d p 1 [ i − 1 ] [ j ] + G [ i ] [ j ] j = 1 m a x { d p 1 [ i ] [ j − 1 ] , d p 1 [ i − 1 ] [ j ] } + G [ i ] [ j ] i ≠ 1 , j ≠ 1 dp1[i][j]=\left\{\begin{matrix} &dp1[i][j-1]+G[i][j]\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ i=1\\ \\ &dp1[i-1][j]+G[i][j]\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ j=1\\ \\ &max\left \{ dp1[i][j-1],dp1[i-1][j] \right \}+G[i][j]\ \ \ \ i\neq 1,j\neq 1\end{matrix}\right. dp1[i][j]=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧