題目:在乙個m×n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值(價值大於0)。你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物,請計算你最多能拿到多少價值的禮物?
思路:劍指中的思路如下:這道題可以使用動態規劃解決問題。可以先用遞迴的思路分析。可以定義乙個函式f(i,j)表示達到座標(i,j)的格仔時能拿到的禮物總和的最大值。由題目可知,有兩種方法可以到達這個位置,即通過格仔(i-1,j),(i,j-1)。所以有以下公式成立:
f(i,j)=max(f(i-1,j),f(i,j-1))+gift[i,j]
但是使用遞迴的話會有大量重複的計算,因此使用迴圈。為了儲存中間計算的結果,我們使用乙個輔助的二維陣列,各個位置表示能拿到的禮物價值總和的最大值。這種思路是**1.
可以對**1進行優化。(i,j)的值d和只與(i-1,j),(i,j-1)有關,因此第i-2行以及更上面的最大值並不需要儲存下來。因此可以使用乙個一維陣列來儲存。一維陣列的長度是棋盤的列數,陣列中前i個數字儲存的是f(i,0),f(i,1),f(i,2)....f(i,j-1),陣列後面的數字是f(i-1,j),f(i-1,j+1),...f(i-1,n-1).我們只需要第i個和i-1個陣列元素。這種思路是**2.
**1:
public class greatestgift
int rows = arr.length;
int cols = arr[0].length;
int maxvalue = new int[rows][cols];
for (int i = 0; i < rows; i++)
if(j>0)
maxvalue[i][j] = math.max(up, left) + arr[i][j];}}
return maxvalue[rows-1][cols-1];}}
**2:
/*** 禮物的最大價值(使用迴圈實現)
*/public class greatestgift2
int rows = arr.length;
int cols = arr[0].length;
int maxvalue = new int[cols];
for (int i = 0; i < rows; i++)
if(j > 0)
maxvalue[j] =math.max(up, left) + arr[i][j];}}
return maxvalue[cols-1];}}
劍指offer 禮物的最大值
在乙個m n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值 價值大於0 你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向左或者向下移動一格直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物,請計算你最多能拿到多少價值的禮物?動態規劃。對於每個格仔 第0行 第0列除外 它可能是從正上方的格仔過來能...
劍指 47 禮物的最大價值
1 禮物的最大價值 在乙個 m n 的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值 價值大於 0 你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格 直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物的價值,請計算你最多能拿到多少價值的禮物?力扣鏈結 思路 動態規劃 狀態表示 d...
劍指offer 47 滑動視窗的最大值
題目 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 思路 暴力法,兩層迴圈,找到視窗的最大值 啟發或者坑 如果視窗大小k接近於n,那這個複雜度可能是n 2 class s...