動態規劃-美團筆試-最大直方圖
阿新 • • 發佈:2019-01-24
題目:
有一個直方圖,用一個整數陣列表示,其中每列的寬度為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];
}