[LeetCode](week10) 931. Minimum Falling Path Sum

對動態規劃仍然不熟,而且最近想掌握一下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
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,505評論 0 13
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,449評論 0 10
  • spark Executor的內存大小設置一直是長期困擾開發人員和分析師的一個大問題。不同應用使用的算法和數據不同...
    breeze_lsw閱讀 745評論 0 0
  • “……這里的山路十八彎這里水路九連環這里的山歌排對排這里的山歌串對串排對排呀排出了土家人的苦和甜串對串呀串出了土家...
    玄春讀旅吧閱讀 444評論 0 3
  • 取按鈕文字的三種方法: 1.比較快捷的方法: titleButton.currentTitle 取出當前顯示在按鈕...
    要加油啊小和尚閱讀 368評論 0 51