---恢復內容開始---
給你乙個矩陣,選出最大的棋盤,棋盤的要求是黑白相間(01不能相鄰),求出最大的正方形和矩形棋盤的面積;
資料n,m<=2000;
這個一看就可能是n2dp,但是寫不出。單走一波暴力(sb);
懸線法:就是將限制條件看成一根線,能擴充套件的最大長度,線要直;
矩形就是這樣;
用l[i][j]表示i,j合法的情況下左邊能延伸的座標,r[i][j]是在右邊能延伸的座標;
up[i][j]是能向上延長的長度;
預處理過後,以i,j作為下底邊,用左右上能延伸的長度更新ans;
#include#include#include
using
namespace
std;
const
int maxn=5010
;int
n,m;
inta[maxn][maxn];
intl[maxn][maxn],r[maxn][maxn];
intup[maxn][maxn],down[maxn][maxn];
intans1,ans2;
intmain()
}for(int i=1;i<=n;i++)
for(int j=m-1;j>=1;j--)
}for(int i=2;i<=n;i++)}}
for(int i=1;i<=n;i++)
}printf(
"%d\n%d
",ans1,ans2);
return0;
}
---恢復內容結束---
P1169 ZJOI2007 棋盤製作
隨手一寫就衝進了最優解的第一頁?本來以為是dp,但是經過仔細分析.這不就是二進位制 單調棧麼?然後想正方形的情況.emm.好像正方形一定是最大矩形的子矩陣吧 聽說此題dp也可行?include include include include include using namespace std t...
P1169 ZJOI2007 棋盤製作 貪心
乙個矩陣中求乙個最大的子矩陣和子正方形使得它們其中都是01交錯。l ef ti,j left lefti,j 表示 i,j i,j i,j 往左擴充套件多遠,rig hti,jright righti j 表示 i,j i,j i,j 往右擴充套件多遠,upi j up up i,j 表示 i,j ...
題解 P1169 ZJOI2007 棋盤製作
依然是懸線法,不過要注意這裡棋盤向外擴張的時候需要滿足條件 g i j g i 1 j 0g i j oplus g i 1 j 0 g i j g i 1 j 0最大正方形可以由過程中求出的每乙個極大棋盤得到。include include using namespace std const in...