以前寫過求最大正方形面積的題目,這只要處理 [i-1][j],[i][j-1],[i-1][j-1] 三個位置的最小值就可以,用不到懸線法,簡單的線性dp;
但是當要求最大長方形時,那種方法就不適合了,懸線法就出現了;
模板題: p4147 玉蟾宮
懸線法可以分為三個部分:
l[i][j] 代表位置 (i,j) 可以往左擴充套件的最小座標,就是最遠的座標
r[i][j] 代表位置 (i,j) 可以往右擴充套件的最大座標,就是最遠的座標
up[i][j] 代表位置 (i,j) 可以往上擴充套件的最大距離,不是座標了
l,r 陣列都要進行預處理,最關鍵的是在進行dp時,l 陣列要取最大值,r 陣列要取最小值,up 陣列加 1 ,就跟求最大正方形面積的思路是一樣的,要保證最短的也符合條件;
**:
#include
#define ll long long
#define pa pair
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using
namespace std;
const
int n=
1100
;const
int m=
50100
;const
int mod=
1e9;
int n,m,a[n]
[n];
int l[n]
[n],r[n]
[n],up[n]
[n];
intmain()
}for
(int i=
1;i<=n;i++)}
for(
int i=
1;i<=n;i++)}
int ans=0;
for(
int i=
2;i<=n;i++
) ans=
max(ans,
(r[i]
[j]-l[i]
[j]+1)
*up[i]
[j]);}
} cout<3
}
懸線法 學習筆記
之前的考試包括做題都有用過這個方法,算是個套路了。寫一篇部落格總結一下。懸線法的用途 針對求給定矩陣中滿足某條件的極大矩陣,比如 面積最大的長方形 正方形 周長最長的矩形等等 可以滿足在時間複雜度為o m n 的要求,比一般的列舉高效的多,也易於理解。懸線法的思路 懸線法,懸線的定義,就是一條豎線,...
懸線法 學習總結
主要用於求滿足某條件的最大矩陣 一條豎線,豎線的上端點位於矩陣的上邊界或是乙個障礙點,然後對這條懸線進行左右移動,直到移至障礙點或者是矩陣邊界,進行確定這條懸線所在的極大矩陣。底線為 i,j 的懸線 left存每個點能達到的最右位置 right存放每個點能到達的最左邊的位置 height為高度 遞推...
演算法學習筆記六 dp
題目描述 在乙個n n的矩陣中,每個格仔都有乙個整數,pipi位於矩陣的左上角,它想知道有多少條不同合法路線達到矩陣右下角。行走規則如下 1 每次只能往下或往右走一步。2 格仔中的整數表示從該點出發一步必須跨越的距離。ps 對 1 和 2 條件的解釋 若此時在 x,y 並且格仔上的數字為 k 則下一...