演算法題 禮物的最大價值 滾動陣列思想

2021-10-02 21:44:52 字數 1268 閱讀 9909

題目:在乙個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...