[作业]三角蛋糕

三角蛋糕(trigon.pas/c/cpp) 
  XP 在机房里放了一块正三角形的大蛋糕,但是第二天他发现蛋糕被老鼠咬坏了。 
 
  XP 不想让蛋糕白白的被浪费,于是他把蛋糕分割成了一个个的小正三角形(如上图所
示)。黑色的小正三角形表示老鼠把那一块咬坏了。XP 想要切出一块最大的没被老鼠咬坏正
三角形的蛋糕,可是最大的三角形有多大呢? 
 
输入数据     
  第一行,一个整数N,表示XP 把蛋糕纵向划分为N 行。 
  接下来的N 行,第 i 行包括了(n-i)*2+1 个有效字符。“-”表示这块蛋糕是好的,“#”

表示这块蛋糕被咬坏了。为了保持三角形的形状,输入文件中会出现空格。 
输出数据     
      一行一个整数,表示最大的三角形包括的小三角形数。 
 

样例输入与输出     

#-##----# 
 -----#- 
  ---#- 
   -#- 
    - 

 
数据范围 
  对于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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值