1. 程式人生 > >動態規劃-美團筆試-最大直方圖

動態規劃-美團筆試-最大直方圖

題目:
有一個直方圖,用一個整數陣列表示,其中每列的寬度為1,求所給直方圖包含的最大矩形面積。比如,
* 對於直方圖[2,7,9,4],它所包含的最大矩形的面積為14(即[7,9]包涵的7x2的矩形)。
給定一個直方圖A及它的總寬度n,請返回最大矩形面積。保證直方圖寬度小於等於500。保證結果在int範圍內。
測試樣例:[2,7,9,4,1],5
返回:14

思路:根據動態規劃的思路,建立一個dp表,dp[i][j]的意思是i到j之間的最大矩形面積。
dp[i][j]的計算有三種可能:
1。取最小面積乘以總個數
2。取(dp[i][j-1]
3。取dp[i+1][j]
總結來說dp的值為:
dp[i][i+k]=Math.max(dp[i][i+k-1], dp[i+1][i + k]);
dp[i][i+k]=Math.max(min*(k+1),dp[i][i+k]);
根據思路寫出程式碼如下:

 /**
     * 思路動態規化,dp計算。
     * dp[i][j]的意思是i到j之間的最大矩形面積,這樣就容易理解
     * @param A
     * @param n
     * @return
     */
    public int countArea(int[] A, int n) {
        if (A==null){
            return 0;
        }
        int dp[][]=new int[n][n];
        //賦值初值
        for (int i = 0; i < n; i++) {
            dp[i][i]=A[i];
        }
        for
(int k = 1; k <=n ; k++) { for (int i = 0; (i+k) <n ; i++) { //先算出最小值 int min=A[i]; for (int j = i+1; j <= i+k; ++j) { min = Math.min(min, A[j]); } dp[i][i+k]=Math.max(dp[i][i+k-1], dp[i+1
][i + k]); dp[i][i+k]=Math.max(min*(k+1),dp[i][i+k]); } } return dp[0][n-1]; }