poj1088 滑雪

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int m,n;//m行n列
int h[110][110];
int d[110][110];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool in(int x,int y)
{
    if(x>=0&&x<m&&y>=0&&y<n)
    {
        return true;
    }
    return false;
}
void dp(int p,int q)
{
    int i;
    int ii,jj;
    int mmax=0;
    for(i=0;i<4;i++)
    {
        ii=p+dir[i][0];
        jj=q+dir[i][1];
        if(!in(ii,jj))
        {
            continue;
        }
        if(h[ii][jj]>=h[p][q])
        {
            continue;
        }
        if(d[ii][jj]==-1)
        {
            dp(ii,jj);
        }
        if(mmax<d[ii][jj])
        {
            mmax=d[ii][jj];
        }
    }
    d[p][q]=mmax+1;
}
int main()
{
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        int i,j;
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&h[i][j]);
            }
        }
        memset(d,-1,sizeof(d));
        int mmax=-1;
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++)
            {
                if(d[i][j]==-1)
                {
                    dp(i,j);
                }
                if(mmax<d[i][j]+1)
                {
                    mmax=d[i][j]+1;
                }
            }
        }
        printf("%d\n",mmax-1);
    }
    return 0;
}
posted @ 2012-08-08 09:26  willzhang  阅读(200)  评论(0)    收藏  举报