題目來自於洛谷 p1169 棋盤製作 。
在乙個01矩陣中找到乙個最大的01相間的正方形與長方形。
這個問題可以使用動態規劃——懸線法來解決。陣列 lef
t[i]
[j],
righ
t[i]
[j],
up[i
][j]
left[i][j], right[i][j], up[i][j]
left[i
][j]
,rig
ht[i
][j]
,up[
i][j
] 分別表示從 (i,
j)
(i, j)
(i,j
) 出發符合條件能到達的最左邊,最右邊,最上邊。首先初始化 lef
t[i]
[j]=
j,ri
ght[
i][j
]=j,
up[i
][j]
=1
left[i][j] = j, right[i][j] = j, up[i][j] = 1
left[i
][j]
=j,r
ight
[i][
j]=j
,up[
i][j
]=1,預處理陣列 lef
t[i]
[j],
righ
t[i]
[j
]left[i][j], right[i][j]
left[i
][j]
,rig
ht[i
][j]
。之後開始更新 lef
t[i]
[j],
righ
t[i]
[j],
up[i
][j]
left[i][j], right[i][j], up[i][j]
left[i
][j]
,rig
ht[i
][j]
,up[
i][j
] ,狀態轉移方程為
left[i][j] = max(left[i][j], left[i-1][j])
right[i][j] = min(right[i][j], right[i-1][j])
#include
#include
#include
#define ll long long
using
namespace std;
const
int maxn=
2005
;int s[maxn]
[maxn]
,lt[maxn]
[maxn]
,rt[maxn]
[maxn]
,up[maxn]
[maxn]
;int
main()
}for
(int i=
1;i<=n;i++)}
for(
int i=
1;i<=n;i++)}
for(
int i=
1;i<=n;i++
)int l=rt[i]
[j]-lt[i]
[j]+1;
int r=
min(l,up[i]
[j])
; ans1=
max(ans1,r*r)
; ans2=
max(ans2,l*up[i]
[j]);}
}printf
("%d\n%d\n"
, ans1, ans2)
;return0;
}
ZJOI2007 棋盤製作 解題報告
西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 times 88 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好...
棋盤製作 題解
題目描述 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w...
單調棧 棋盤製作
program as var a,b array 0.2000,0.2000 of longint c array 0.2000,1.2 of longint n,m,i,j,l,cfx,zfx longint function min a,b longint longint begin if a ...