在乙個m×n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值(價值大於0)。你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向左或者向下移動一格直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物,請計算你最多能拿到多少價值的禮物?
動態規劃。
對於每個格仔(第0行、第0列除外)它可能是從正上方的格仔過來能得到最大值,也可能從正左方的格仔過來取得最大值,
所以當到達(i,j)格仔時,禮物的最大值為:
當前格仔禮物的價值 + max(到達左方格仔的最大總價值,到達上方格仔的最大總價值)
即狀態轉移方程:dp[i][j]=max(dp[i-1][j],dp[i][j-1]) + values[i][j];
int getmaxvalue_solution1(const int* values, int rows, int cols)
} return dp[rows-1][cols-1];
}
書上的**似乎更加簡單易懂:
int getmaxvalue_solution1(const int* values, int rows, int cols)
} return dp[rows-1][cols-1];
}
可以優化空間,只使用乙個一維陣列來儲存狀態:
int getmaxvalue_solution2(const int* values, int rows, int cols)
} return dp[cols-1];
}
劍指筆記 47 禮物的最大值
題目 在乙個m n的棋盤的每一格都放有乙個禮物,每個禮物都有一定的價值 價值大於0 你可以從棋盤的左上角開始拿格仔裡的禮物,並每次向右或者向下移動一格直到到達棋盤的右下角。給定乙個棋盤及其上面的禮物,請計算你最多能拿到多少價值的禮物?思路 劍指中的思路如下 這道題可以使用動態規劃解決問題。可以先用遞...
佇列的最大值 劍指Offer
題目描述 定義乙個佇列並實現函式 max value 得到佇列裡的最大值,要求函式max value push back 和 pop front 的均攤時間複雜度都是o 1 若隊列為空,pop front 和 max value 需要返回 1 題解 我對於這道題,剛開始看的稍微有點懵,後來才知道是描...
劍指Offer 佇列的最大值
請定義乙個佇列並實現函式 max value 得到佇列裡的最大值,要求函式max value push back 和 pop front 的均攤時間複雜度都是o 1 若隊列為空,pop front 和 max value 需要返回 1 示例 1 輸入 maxqueue push back push ...