懸線法:
用於解決給定矩陣滿足條件的最大子矩陣。
做法:用一條線(橫豎都行)左右移動直到不滿足約束條件或者到達邊界。
定義:\(left(i,j)\):表示\((i,j)\)向左擴充套件能夠到達的最左邊的位置。
\(right(i,j)\):表示\((i,j)\)向右擴充套件能夠到達的最右邊的位置。
\(up(i,j)\):表示\((i,j)\)向上能夠拓展的最長長度。
遞推公式:
\(left(i,j)=max\\).
\(right(i,j)=min(right(i,j),right(i-1,j))\).
因為有\(up\)陣列,\(up\)陣列表示向上拓展的最長長度,所以要考慮上一層的情況。
#includeusing namespace std;
const int maxn = 2e3 + 10;
int a[maxn][maxn], n, m;
int lef[maxn][maxn];
int rig[maxn][maxn];
int up[maxn][maxn];
int main()
for(int i = 1; i <= n; i++)
for(int i = 1; i <= n; i++)
int ans1, ans2;
ans1 = ans2 = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
int a = rig[i][j] - lef[i][j] + 1;
int b = up[i][j];
ans1 = max(ans1, min(a,b)*min(a,b));//õý·½ðî
ans2 = max(ans2, a*b);
} cout << ans1 << endl << ans2 << endl;
return 0;
}
洛谷 P1169 棋盤製作(懸線法DP)
題目大意 有乙個0,1矩陣。求其中的0,1交錯的最大子正方形矩陣和長方形矩陣的面積。解題思路 求這種最大子矩陣的題目很可能是懸線法。這個矩陣某個格仔 i,j 向左可能延伸到多遠,向右可能延伸到多遠,向上可能延伸到多遠,然後在確定縱向可以向下延伸時候利用轉移公式 up i j up i 1 j 1 l...
懸線法 棋盤製作
description 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟...
P1169 ZJOI2007 棋盤製作(懸線法)
題目描述 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 times 88 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是...