pku 1471 Triangles

标签: iostream input n2
373人阅读 评论(0) 收藏 举报

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

与另外一道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;
}
查看评论

Triangles

Problem description You will be given N points on a circle. You must write a program to determine ho...
  • u011123263
  • u011123263
  • 2014-09-26 19:01:29
  • 355

HDU1936--Counting Triangles

Description Given an equilateral triangle with n the length of its side, program to count how man...
  • a305657
  • a305657
  • 2013-02-24 23:37:38
  • 290

Project Euler:Problem 39 Integer right triangles

If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exact...
  • youb11
  • youb11
  • 2015-06-04 11:22:21
  • 548

POJ 1471 Triangles 笔记

如图,n层的倒三角型,#为黑色,-为白色。求最大的白色三角形包含的小三角形数。...
  • woniupengpeng
  • woniupengpeng
  • 2017-06-20 10:22:22
  • 112

POJ 1471 Triangles(dfs)

sd Description It is always very nice to have little brothers or sisters. You can tease them, lo...
  • Chain_xg
  • Chain_xg
  • 2014-10-10 18:56:14
  • 330

poj 1471 Triangles

dp,注意三角形朝向问题,每个位置的三角形只能朝一个特定的方向延伸。   #include #include #include #include #include using namespace ...
  • taozifish
  • taozifish
  • 2012-08-22 13:07:02
  • 580

ieee 1471 软件体系结构标准文档

  • 2008年07月06日 09:47
  • 481KB
  • 下载

IEEE-1471

Normal 0 7.8 磅 0 2 false false false Microsof...
  • xu_zh_h
  • xu_zh_h
  • 2009-08-12 14:17:00
  • 1825

例题8-8 防线 UVa1471

1.题目描述:点击打开链接 2.解题思路:本题要求在一个长度为n的序列中,删除一段连续子序列,使得剩下的序列有一个长度最大的连续递增子序列。按照以往的经验,可以事先用f[i]计算出从i出发的最长连续...
  • u014800748
  • u014800748
  • 2015-08-24 22:25:00
  • 831

UVA - 1471 Defense Lines 贪心+二分

题目大意:给出长度为n的序列,要求你删除掉一段的连续子序列,使得剩下的序列的递增子序列最长解题思路:记录以下每个位置的值所能延伸的最左端和最右端,用一个数组记录长度为i的数的最小值,然后从左往右扫描,...
  • L123012013048
  • L123012013048
  • 2015-04-15 09:35:51
  • 1073
    个人资料
    等级:
    访问量: 4万+
    积分: 846
    排名: 6万+
    文章分类
    最新评论