解題隨筆 棋盤製作

2021-10-02 17:09:56 字數 1949 閱讀 9167

題目來自於洛谷 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 ...