'''
给定一个包含非负整数的 m x n 网格 grid ，请找出一条从左上角到右下角的路径，使得路径上的数字总和为最小。

说明：每次只能向下或者向右移动一步。



示例 1：

输入：grid = [[1,3,1],[1,5,1],[4,2,1]]
输出：7
解释：因为路径 1→3→1→1→1 的总和最小。

示例 2：

输入：grid = [[1,2,3],[4,5,6]]
输出：12

提示：

m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
'''
from typing import List

from leetcode.tools.time import printTime


class Solution:
    @printTime()
    def minPathSum(self, grid: List[List[int]]) -> int:
        len1 = len(grid)
        len2 = len(grid[0])
        dp = [[0 for _ in range(len2)] for _ in range(len1)]
        for i in range(len1):
            for j in range(len2):
                dp[i][j] += grid[i][j]
                if i == 0 and j != 0:
                    dp[i][j] += dp[i][j - 1]
                elif i != 0 and j == 0:
                    dp[i][j] += dp[i - 1][j]
                elif i > 0 and j > 0:
                    dp[i][j] += min(dp[i - 1][j], dp[i][j - 1])
        return dp[-1][-1]

grid = [[1]]
Solution().minPathSum(grid)