题目描述:给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。
注意:你每次只能向下或向右移动。
示例:
输入:[[1,2],[5,6],[1,1]]
输出:8
题目链接:https://www.nowcoder.com/practice/23462ed010024fcabb7dbd3df57c715e?tpId=46&tqId=29115&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
如图:
因为题目说过只能下下走或者向上走,所以第一行和第一列必须得特殊处理一下,如果是第一行,那么他只能向右走,如果是第一列那么它只能是向下走.
举个栗子:
如上图:
要想得到2位置的带权路径和,那么只能是从他的左边位置,也就是和他左边的1相加,因为他前边的值只能向右走,没有向下走的值(因为他是第一行),想要获得5位置的带权路径和,它也只能是和他上边的数相加,因为他没有向右走的值(因为此时他是第一列),他下边的1也是同理.
特判完了之后,我们接下来看其他位置,其实其他位置的值都有从它自己的上方来的和左边来的.所以就取那两个值中最小的和当前的值相加就可以.
解法如图:
话不多说,直接上代码
/*状态:
子状态:从(0,0)到达(1,0),(1,1),(2,1),...(m-1,n-1)的最短路径
F(i,j): 从(0,0)到达F(i,j)的最短路径
状态递推:
F(i,j) = min{F(i-1,j) , F(i,j-1)} + (i,j)
初始化:
F(0,0) = (0,0)
特殊情况:第0行和第0列
F(0,i) = F(0,i-1) + (0,i)