1. 程式人生 > >動態規劃-直方圖內最大矩形

動態規劃-直方圖內最大矩形

有一個直方圖,用一個整數陣列表示,其中每列的寬度為1,求所給直方圖包含的最大矩形面積。比如,對於直方圖[2,7,9,4],它所包含的最大矩形的面積為14(即[7,9]包涵的7x2的矩形)。

給定一個直方圖A及它的總寬度n,請返回最大矩形面積。保證直方圖寬度小於等於500。保證結果在int範圍內。

動態規劃方法,構建動態陣列dp[i][j],含義是從第i個元素到第j個元素構成矩形最大面積。

分析:

dp[i][j]最大結果只與A[j]大小有關,dp[i][j]有下列四種情況,第一種情況與第二種情況可理解為一種情況,取最左邊和最右邊兩者的最小值作為高的矩形。


程式碼如下:

class MaxInnerRec {
public:
    int countArea(vector<int> A, int n) {
        // write code here
       vector<vector<int>>dp(n);
        for(int i=0;i<n;i++)
            dp[i].resize(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++)
                    {
                    if(A[j]<min)
                        min=A[j];
}
                dp[i][i+k]=max(dp[i][i+k-1],dp[i+1][i+k]);
                dp[i][i+k]=max(min*(k+1),dp[i][i+k]);
}
}
        return dp[0][n-1];
    }
};