美文网首页
[LeetCode](week10) 931. Minimum

[LeetCode](week10) 931. Minimum

作者: jeff98 | 来源:发表于2018-11-28 23:30 被阅读0次

    对动态规划仍然不熟,而且最近想掌握一下Go语言,所以用它来做一下算法题

    题目

    Given a square array of integers A, we want the minimum sum of a falling path through A.

    A falling path starts at any element in the first row, and chooses one element from each row. The next row's choice must be in a column that is different from the previous row's column by at most one.

    Example 1:

    Input: [[1,2,3],[4,5,6],[7,8,9]]
    Output: 12
    Explanation: 
    The possible falling paths are:
    [1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
    [2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
    [3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]
    The falling path with the smallest sum is [1,4,7], so the answer is 12.
    

    Note:

    • 1 <= A.length == A[0].length <= 100
    • -100 <= A[i][j] <= 100

    题解

    这道题是很简单的动态规划题,题目解析在注释里已经有了。

    func minFallingPathSum(A [][]int) int{
        //题目:二维数组,像水流一样降落(降落时不能隔开超过一列),求降落总和最大
        //状态:当以 A[row][col] 结尾时的最大总和
        rowNum := len(A)
        colNum := len(A[0])
        //构建二维数组
        min := make([][]int, rowNum)
        for i:=0; i<rowNum; i++{
            min[i] = make([]int, colNum)
        }
    
    
        //计算min值
        min[0] = A[0]
        for row:=1; row<rowNum; row++{
            for col:= 0; col<colNum; col++{
                if col == 0{
                    switch{
                    case min[row-1][col] < min[row-1][col+1]:
                        min[row][col] = A[row][col] + min[row-1][col]
                    default:
                        min[row][col] = A[row][col] + min[row-1][col+1]
                    }
                } else if col == colNum-1{
                    switch{
                    case min[row-1][col] < min[row-1][col-1]:
                        min[row][col] = A[row][col] + min[row-1][col]
                    default:
                        min[row][col] = A[row][col] + min[row-1][col-1]
                    }
                } else{
                    switch{
                    case min[row-1][col-1] < min[row-1][col] && min[row-1][col-1] < min[row-1][col+1]:
                        min[row][col] = A[row][col] + min[row-1][col-1]
                    case min[row-1][col] < min[row-1][col+1]:
                        min[row][col] = A[row][col] + min[row-1][col]
                    default:
                        min[row][col] = A[row][col] + min[row-1][col+1]
                    }
                }
            }
        }
        result := min[rowNum-1][0]
        for i:=1; i<colNum; i++{
            if min[rowNum-1][i] < result{
                result = min[rowNum-1][i]
            }
        }
        return result
    }
    

    相关文章

      网友评论

          本文标题:[LeetCode](week10) 931. Minimum

          本文链接:https://www.haomeiwen.com/subject/tmbtcqtx.html