POJ 1964 懸線法 DP 單調棧

2021-10-18 16:35:05 字數 1265 閱讀 2614

題意

傳送門 poj 1964 city game

題解懸線法 dp

懸線法 dpdp

dp的基本思想,即求解每乙個點向上可拓展的高度以及以這個高度為高的矩形的最長寬,以更新答案。此時可保證遍歷所有可能的面積最大的矩形。

#include

#include

#include

using

namespace std;

const

int maxn =

1005

;char mat[maxn]

[maxn]

;int k, n, m, l[maxn]

[maxn]

, r[maxn]

[maxn]

, u[maxn]

[maxn]

;int

main()

res =

max(res,

(u[i]

[j]+1)

*(l[i]

[j]+ r[i]

[j]+1)

);}printf

("%d\n",3

* res);}

return0;

}

單調棧

列舉每一行向上可拓展的最大高度,問題轉化為求解單位寬度、高度不等的連續排列矩形所能構成的矩形的最大面積。

可以觀察到,當矩形高度遞增時,每乙個高度都是最大面積矩形的備選答案;若出現高度小於上乙個的矩形,那麼對於之後的矩形,所組成的矩形高度受限於這個高度較小的矩形。於是用單調棧維護乙個高度遞增的矩形,當出現高度較小的矩形時,將其不斷與之前的高度比它大的矩形在寬度上進行合併,同時更新答案。

#include

#include

#include

using

namespace std;

const

int maxn =

1005

;char mat[maxn]

[maxn]

;int k, n, m, top, h[maxn]

, st[maxn]

, w[maxn]

;int

solve

(int i)

}return res;

}int

main()

printf

("%d\n",3

* res);}

return0;

}

poj1964最大子矩陣 (單調棧加列舉)

題目傳送門 題目大意 乙個矩陣中,求f組成的矩陣的面積,答案乘以三 思路 n如果是小於100的,就可以通過字首和,然後三重迴圈暴力找,和poj1050很像,但由於是1000,就不可以了,時間複雜度太高。這道題的類別是單調棧,仔細想一下,發現其實就是先統計每一行網上有多少個長方形,然後再列舉每一行,算...

懸線法DP總結

求滿足某種條件 如01交替 的最大矩形 正方形 先預處理出 ml i j mr i j mt i j 分別表示當前位置 i,j 能向左擴充套件到的最左邊的編號 能向右擴充套件到的最右邊的編號 能向上擴充套件到的最大高度。然後在做 dp 時,除第一行,每行根據上一行的狀態更新當前狀態,逐行掃一遍。複雜...

BZOJ3039 玉蟾宮(懸線dp 單調棧)

description 有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。這片土地被分成n m個格仔,每個格仔裡寫著 r 或者 f r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。現在freda要在這裡賣...