線性dp之懸線法學習筆記

2021-10-06 21:54:08 字數 1127 閱讀 4818

以前寫過求最大正方形面積的題目,這只要處理 [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 則下一...