演算法學習之禮物的最大值

2021-10-01 05:37:16 字數 1339 閱讀 7217

題目:在乙個m×n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值(價值大於0)。你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格,直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物,請計算你最多能拿到多少價值的禮物?

例如,在下面的棋盤中,如果沿著加粗的數字的線路(1、12、5、7、7、16、5),那麼我們能拿到最大價值為53的禮物。

110   3    8

122    9    6

574    11

37165

思路:

1、跟上一題很相似,所以很容易想到動態規劃來求解。我們注意到當前最大值只跟其上乙個及左鄰居兩個點處的最大禮物值有關,所以有:f(i,j) = max(f(i-1,j),f(i,j-1))+gift(i,j);其中gift(i,j)為當前位置的值。然後使用已知二維陣列長度新建輔助二維陣列用來記錄當前點的最大值就可以了。

2、其次,我們還可以優化**,使用一維陣列記錄最大值,具體看下方。

當我們求a處最大值時,其實1就可以被替換掉了,因為根據規則下一步只能往下或者往右走,所以以後不會再用到它,再如求到b處最大值時11就可以被替換掉了。換個說法就是b處最大值求出來以後就可以直接覆蓋掉14這個位置。從走勢不難發現,資料走向是一直向右的,直到到右下角位置停止。說到這裡我們其實我們腦子了大概就有了一維陣列儲存的模型了,就是一行的長度。類似於下邊這種模式。

x  x  x  x

x  x  o  o

o  o m  x

x  x  x   x

public int getmaxvalue2(int arr) 

if(j>0)

maxvalue[j] = math.max(up,left)+arr[i][j];}}

return maxvalue[cols-1];

}

禮物的最大值

題目 在乙個m n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值 價值大於0 你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物,請計算你最多能拿到多少價值的禮物?解答 使用動態規劃,f i,j 表示到達座標 i,j 時能拿到的最...

劍指offer 禮物的最大值

在乙個m n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值 價值大於0 你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向左或者向下移動一格直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物,請計算你最多能拿到多少價值的禮物?動態規劃。對於每個格仔 第0行 第0列除外 它可能是從正上方的格仔過來能...

演算法學習十五 找陣列最大值和最小值

題目 給定乙個陣列,找出陣列中的最大值和最小值 演算法思路一 使用兩個 游標 p代表最大值,q代表最小值,初始為陣列的第乙個和第二個,不斷向後移並且做比較,每次移動時將較大值與p比較,將p賦為較大值,較小值也同理。這樣就能找到最大值和最小值。此演算法要注意的地方就是當陣列只有乙個元素以及陣列的個數為...