三角蛋糕(trigon.pas/c/cpp)
XP 在机房里放了一块正三角形的大蛋糕,但是第二天他发现蛋糕被老鼠咬坏了。
XP 不想让蛋糕白白的被浪费,于是他把蛋糕分割成了一个个的小正三角形(如上图所
示)。黑色的小正三角形表示老鼠把那一块咬坏了。XP 想要切出一块最大的没被老鼠咬坏正
三角形的蛋糕,可是最大的三角形有多大呢?
输入数据
第一行,一个整数N,表示XP 把蛋糕纵向划分为N 行。
接下来的N 行,第 i 行包括了(n-i)*2+1 个有效字符。“-”表示这块蛋糕是好的,“#”
XP 在机房里放了一块正三角形的大蛋糕,但是第二天他发现蛋糕被老鼠咬坏了。
XP 不想让蛋糕白白的被浪费,于是他把蛋糕分割成了一个个的小正三角形(如上图所
示)。黑色的小正三角形表示老鼠把那一块咬坏了。XP 想要切出一块最大的没被老鼠咬坏正
三角形的蛋糕,可是最大的三角形有多大呢?
输入数据
第一行,一个整数N,表示XP 把蛋糕纵向划分为N 行。
接下来的N 行,第 i 行包括了(n-i)*2+1 个有效字符。“-”表示这块蛋糕是好的,“#”
表示这块蛋糕被咬坏了。为了保持三角形的形状,输入文件中会出现空格。
输出数据
一行一个整数,表示最大的三角形包括的小三角形数。
样例输入与输出
5
#-##----#
-----#-
---#-
-#-
-
9
数据范围
对于30%的数据,满足n≤5
对于所有的测试数据,满足n≤100。
-------------------------------------------------------------------------------------------------------------------DP,首先要注意三角形可以朝上,也可以朝下,其次要注意,独立的三角形是有朝向的。
-------------------------------------------------------------------------------------------------------------------
代码:
var
a:array[0..101,0..201] of char;
f:array[0..101,0..201,0..1] of longint;
n,i,j,ans:longint;
function min(a,b,c:longint):longint;
begin
min:=a;if b<min then min:=b;if c<min then min:=c;
end;
begin
assign(input,'trigon.in');reset(input);
assign(output,'trigon.out');rewrite(output);
readln(n);
fillchar(a,sizeof(a),0);
for i:=1 to n do begin
for j:=1 to (i-1)+(n-i)*2+1 do read(a[i,j]);
readln;
end;
ans:=0;
fillchar(f,sizeof(f),0);
for i:=1 to n do
for j:=i to (i-1)+(n-i)*2+1 do begin
if a[i,j]='-' then f[i,j,0]:=min(f[i-1,j-1,0],f[i-1,j,0],f[i-1,j+1,0])+1 else f[i,j,0]:=0;
if (f[i,j,0]>ans)and((j-i+1)mod 2=1) then ans:=f[i,j,0];
end;
for i:=n downto 1 do
for j:=i to (i-1)+(n-i)*2+1 do begin
if a[i,j]='-' then f[i,j,1]:=min(f[i+1,j-1,1],f[i+1,j,1],f[i+1,j+1,1])+1 else f[i,j,1]:=0;
if (f[i,j,1]>ans)and((j-i+1)mod 2=0) then ans:=f[i,j,1];
end;
write(ans*ans);
close(input);close(output);
end.