題目:在乙個m * n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值(價值大於0)。你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格,直到到達棋盤的右下角。給定乙個棋盤以及上面的禮物,請計算最多能拿到多少價值的禮物?
思路:這是乙個典型的動態規劃題目。我們定義函式f(i,j)表示到達座標(i,j)的格仔時能拿到的禮物總和的最大值。我們可以通過格仔(i-1,j)和(i,j-1)到達(i,j)所以我們可以定義f(i,j) = max(f(i-1,j), f(i,j - 1) + gift(i,j))。gift(i,j)表示格仔(i,j)裡的禮物價值。
我們用遞迴來分析問題,但由於有大量重複計算,我們用迴圈來編寫**會提高很多效率。為了快取中間結果,我們需要乙個二維陣列。陣列中中座標為(i,j)的元素表示到達這個座標的格仔時能拿到的禮物價值總和的最大值。
解析來我們用c++進行程式設計:
int
getmaxvalue
(const
int& numbers,
int rows,
int cols)
}int max = maxvalues[rows -1]
[cols -1]
;for
(int i =
0; i < rows; i++
)delete
maxvalues[i]
;delete
maxvalues;
return max;
}
優化思路:我們知道,到達座標(i,j)的格仔時能夠拿到的禮物的最大價值只依賴座標為(i - 1, j)和(i, j - 1)的兩個格仔,因此第i- 2行及更上面的所有格仔禮物的最大價值其實沒有必要儲存下來。我們可以用一維陣列來替代前面**中的二維矩陣maxvalues。該一維陣列的長度為棋盤的列數n。該陣列前面j個數字分別是當前第i行前面j個格仔禮物的最大價值,而之後的數字分別儲存前面第i - 1行n-j個格仔禮物的最大價值。
接下來我們用c++進行程式設計:
int
getmaxvalue
(const
int& numbers,
int rows,
int cols)
}int max = maxvalues[cols -1]
;delete
maxvalues;
return max;
}
禮物的最大價值
題目 在乙個mxn的棋盤的每乙個都放有乙個禮物,每個禮物都有一定的價值 價值大於0 你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格,知道到達棋盤的右下角。給定乙個棋盤及其上面的禮物,請計算你最多能達到多少價值的禮物。方法一 動態規劃 二維陣列儲存 int getmaxvalue ...
禮物的最大價值
題目 在乙個m n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值 價值大於0 你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向左或者向下移動一格直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物,請計算你最多能拿到多少價值的禮物?動態規劃,優化前 int getmaxvalue const in...
禮物的最大價值
面試題47 禮物的最大價值 題目 在乙個m n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值 價值大於0 你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或 者向下移動一格直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物,請計 算你最多能拿到多少價值的禮物?static int get ma...