pku 1471 Triangles

这题是一道比较简单的动态规划,类似的可以有最大子矩形和。 

与另外一道triangles也比较像。

 

#include  < iostream >
#define  N 201
using   namespace  std;

char  gh[N][N];

int  row,col,n;

int  rf[N][N][ 2 ];

void  input()
{
    
int  i,j;
    
for  (i = 0 ;i < n;i ++ )
    {
        
for  (j = 0 ;j < 2 * n - i * 2 - 1 ;j ++ )
        {
            cin
>> gh[i][j];
        }
    }
    
for  (i = 0 ;i < n;i ++ )
    {
        
for  (j = 0 ;j < col;j ++ )
        {
            rf[i][j][
0 ] = rf[i][j][ 1 ] =- 1 ;
        }
    }
}

int  f ( int  i, int  j, int  k)
{
    
if  (i < 0 || i >= n || j < 0 || j >= col - i * 2 ) return   0 ;
    
if  (i == 0 ) return  gh[i][j] == ' - ' ;
    
if  (gh[i][j] == ' # ' ) return   0 ;

    
if  (rf[i][j][k] !=- 1 ) return  rf[i][j][k];

    
if  (gh[i - 1 ][j + 1 ] == ' # ' )
    {
        rf[i][j][k]
= 1 ;
    }
    
else
    {
        rf[i][j][k]
= 1 + min(f(i - 1 ,j,k),f(i - 1 ,j + 2 ,k));
    }
    
return  rf[i][j][k];
}


int  g( int  i, int  j, int  k)
{
    
if  (i < 0 || i >= n || j < 0 || j >= col - i * 2 ) return   0 ;

    
if  (i == n - 2 ) return  gh[i][j] == ' - ' ;

    
if  (gh[i][j] == ' # ' ) return   0 ;

    
if  (rf[i][j][k] !=- 1 ) return  rf[i][j][k];

    
if  (gh[i + 1 ][j - 1 ] == ' # ' )
    {
        rf[i][j][k]
= 1 ;
    }
    
else
    {
        rf[i][j][k]
= 1 + min(g(i + 1 ,j,k),g(i + 1 ,j - 2 ,k));
    }
    
return  rf[i][j][k];    
}


int  dp()
{
    
int  mV = 0 ,t,i,j;
    
for  (i = 0 ;i < n;i ++ )
    {
        
for  (j = 0 ;j < col - 2 * i;j += 2 )
        {
            
if  ((t = f(i,j, 0 )) > mV)
                mV
= t;
        }
        
for  (j = 1 ;j < col - 2 * i;j += 2 )
        {
            
if  ((t = g(i,j, 1 )) > mV)
                mV
= t;
        }
    }
    
return  mV;
}

int  main()
{
    
int  result;
    
int  ncase = 0 ;

    
while  (cin >> n)
    {
        ncase
++ ;
        
if  (n == 0 ) break ;
        row
= n;
        col
= 2 * n - 1 ;
        input();

        result
= dp();
        cout
<< " Triangle # " << ncase << endl;
        cout
<< " The largest triangle area is  " << result * result << " . " << endl << endl;
    }
    
return   0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值