7-9 寻宝路线(DP)

博客讨论了如何使用动态规划(DP)解决从左上角到达右下角的方格矩阵中,找到最大宝藏价值和最多路线数的问题。分析了状态转移方程,给出了DP数组dp1和dp2的定义,其中dp1存储最大价值,dp2存储最大价值的路线数。并提供了输入输出示例。
摘要由CSDN通过智能技术生成

在一个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]=

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值