题意:给一个三角形,被分成了很多个三角形(具体看题目里的图),求一个最大的只包含白色三角形三角形。
分析:不难但有点小恶心的题目。方法应该很多,怎么数都行了。我是用类似dp的方法的,如果上一层的[j+1,k-1]这个范围能构成一个纯白色三角形,并且这一层的[j,k]这个范围也都是白的,那么f[i][j][k]就代表了一个纯白色的大三角形。代码写得有些啰嗦,懒得简化了。
 
#include  < iostream >
#include 
< stdio.h >
#include 
< memory.h >
#include 
< cstring >
using   namespace  std;

int  n,ans;
bool  f[ 110 ][ 210 ][ 210 ];
char  b[ 110 ][ 210 ];

void  cal1()
{
    
int i,j,k,tem,up;
    memset(f,
false,sizeof(f));
    
for(j=1;b[1][j];j++)
    
{
        
if((j&1)==0&&b[1][j]=='-'
        
{
            f[
1][j][j]=true;
            ans
=1;
        }

    }

    up
=1;
    
for(i=2;i<=n;i++)
    
{
        up
+=2;
        
for(j=1;b[i][j];j++)
        
{
            
if(j&1continue;
            
for(k=j;b[i][k]=='-'&&k-j+1<=up;k++)
            
{
                
if(k&1continue;
                
if(k==j) 
                
{
                    f[i][j][k]
=true;
                    
if(1>ans) ans=1;
                    
continue;
                }

                
if(f[i-1][j+2][k]==true)
                
{
                    f[i][j][k]
=true;
                    tem
=k-j+1;
                    
if((tem+1)*(tem+1)/4>ans) ans=(tem+1)*(tem+1)/4;
                }

            }

        }

    }

}


void  cal2()
{
    
int i,j,k,tem,up;
    memset(f,
false,sizeof(f));
    
if(b[n][1]=='-'
    
{
        f[n][
1][1]=true;
        
if(1>ans) ans=1;
    }

    up
=1;
    
for(i=n-1;i>=1;i--)
    
{
        up
+=2;
        
for(j=1;b[i][j];j++)
        
{
            
if(!(j&1)) continue;
            
for(k=j;b[i][k]=='-'&&k-j+1<=up;k++)
            
{
                
if(!(k&1)) continue;
                
if(k==j)
                
{
                    f[i][j][k]
=true;
                    
if(1>ans) ans=1;
                    
continue;
                }

                
if(f[i+1][j][k-2]==true)
                
{
                    f[i][j][k]
=true;
                    tem
=k-j+1;
                    
if((tem+1)*(tem+1)/4>ans) ans=(tem+1)*(tem+1)/4;
                }

            }

        }

    }

}


int  main()
{
    
int i,j,k,ca=0;
    
while(scanf("%d",&n)&&n)
    
{
        
for(i=1;i<=n;i++) scanf("%s",&b[i][1]);
        
for(i=2;i<=n;i++)
        
{
            
for(j=1;b[i][j]==' ';j++);
            
for(k=1;b[i][j];j++,k++) b[i][k]=b[i][j];
            b[i][k]
='\0';
        }
    // 转换完毕
        ans=0;
        cal1();
        cal2();
        printf(
"Triangle #%d\n",++ca);
        printf(
"The largest triangle area is %d.\n",ans);
        printf(
"\n");
    }

    
return 0;
}