迎春交誼舞會之集體舞(Vijos1063)

2021-05-28 12:29:54 字數 1879 閱讀 1766

演算法:dp

分析:跟usaco上的某道題基本上就是完全相同。

首先是初始化,對於是'-'的預處理為1,否則預處理為0。

用f[i,j]表示(i,j)這個點的最大的三角形的側邊長,每個點由左上、上、右上三個點轉移而來,取乙個最小值+1,同時必須滿足三個點都不是'#',否則依然為1。

先處理衝上的三角形,然後處理沖下的三角形。

最後只有頂點是當前行的奇數列的才能成為三角形的頂點,所以還需要特別判斷一下。

program vijos1063;

const

maxn=300;

varn,ans:longint;

a:array [0..maxn,0..maxn] of char;

f,ff:array [0..maxn,0..maxn] of longint;

procedure init;

var i,j:longint;

begin

fillchar(f,sizeof(f),0);

fillchar(ff,sizeof(ff),0);

ans:=0;

readln(n);

for i:=1 to n do

begin

for j:=1 to (n shl 1)-i do

begin

read(a[i,j]);

if a[i,j]='-' then

begin

f[i,j]:=1;

ff[i,j]:=1;

endelse a[i,j]:='#';

end;

for j:=(n shl 1)-i+1 to (n shl 1)-1 do a[i,j]:='#';

readln;

end;

end;

function min(x,y:longint):longint;

begin

if x'#') and (a[i-1,j]<>'#') and (a[i-1,j+1]<>'#')) then

begin

f[i,j]:=min(f[i-1,j-1],min(f[i-1,j],f[i-1,j+1]))+1;

if (f[i,j]>ans) and (odd(j-i+1)) then ans:=f[i,j];

end;

end;

end;

end;

procedure main2;

var i,j:longint;

begin

for i:=1 to n-1 do

begin

for j:=2 to (n shl 1)-2 do

begin

if (a[i,j]='-') and ((a[i+1,j-1]<>'#') and (a[i+1,j]<>'#') and (a[i+1,j+1]<>'#')) then

begin

ff[i,j]:=min(ff[i+1,j-1],min(ff[i+1,j],ff[i+1,j+1]))+1;

if (ff[i,j]>ans) and (not odd(j-i+1)) then ans:=ff[i,j];

end;

end;

end;

end;

begin

assign(input,'vj1063.in'); reset(input);

assign(output,'vj1063.out'); rewrite(output);

init;

main1;

main2;

writeln(sqr(ans));

close(input); close(output);

end.

Vijos P1062 迎春舞會之交誼舞

描述 明顯 交誼舞是兩個人跳的,而且是一男一女 由於交誼舞之前的節目安排,所有表演者都要站成一排,這一排人的順序滿足兩點。1 對於一對舞伴,男生站在女生的左邊。2 任何一對舞伴之間,要麼沒有人,要麼有若干對舞伴。排得過於整齊導致那些要表演的人都沒辦法找到自己的舞伴,怎麼辦呢?所幸的是,sdfz的女生...

模擬 Vijos P1062 迎春舞會之交誼舞

題目大意 一群男女站成一排,一男一女配對,女的只找左邊第乙個空閒的男生,給定前n個女生左邊的額男生個數,問前n個女生到男伴之間共有幾個男生。n 1500 女生左側男生231內 題目思路 模擬 每個女生只找左邊的最靠近的閒置男生,所以每當女生左邊的男生數變化的時候就說明隊伍裡加入了新的男生,而這些男生...

迎春舞會之數字舞蹈

給出數字及其要求擺出的大小,程式設計擺出數字 輸入格式 第一行為k。k表示要擺出數字的大小。第二行為全部由數字組成的字串,即要擺出的幾個數字。輸出格式 注意 每個數字之前有1個空格,所有數字全部對齊。k 30,s的長度不超過255 建議大家直接輸出,不要儲存。如果對於大小和k有疑問,請自行理解。輸入...