您的位置:首页 > 其它

Poj 1088 滑雪

2012-07-19 22:37 423 查看
动态规划,求任一点的最长降序串长度,等于周围的 点的最长降序串的长度的最大值加一。而总有一点是的周围点的高度,都小于等于它。但是第一次提交的时候我居然把 横行,纵列的数据输入反了。。。|||

#include <stdio.h>
#include <string.h>
#define MAXL (100+5)

int dir[4][2]={ {-1,0},{0,1},{1,0},{0,-1} };
int map[MAXL][MAXL];
int best[MAXL][MAXL];
int R,C,MAX;

int max( int x, int y)
{
    return x>y ? x :y ;
}

int in_map( int cloumn,int row)
{
    if( cloumn < 1 || cloumn >C )
        return 0;
    if( row <1 || row >R )
        return 0;
    return 1;
}

void dp(int cloumn,int row)
{
    int i;
    int cur_cloumn,cur_row;
    if( best[cloumn][row] != -1)    return ;
    best[cloumn][row]=1;
    for( i=0;i<4;i++)
    {
        cur_cloumn = cloumn+dir[i][0];
        cur_row = row+dir[i][1];
        if( in_map( cur_cloumn , cur_row )
           && map[cur_cloumn][cur_row] > map [cloumn][row] )
        {
            if( best[cur_cloumn][cur_row] == -1 ) dp( cur_cloumn,cur_row );
            best[cloumn][row] = max( best[cur_cloumn][cur_row]+1 , best[cloumn][row] );
        }
    }
    MAX=max( MAX,best[cloumn][row] );
}

int main()
{
    int i,j;
    while( ~scanf("%d%d",&C,&R) )
    {
        for(i=1;i<=C;i++)
            for(j=1;j<=R;j++)
                scanf("%d",&map[i][j]);
        memset( best,-1,sizeof(best) );
        MAX=0;
        for(i=1;i<=C;i++)
            for(j=1;j<=R;j++)
                dp(i,j);
        printf("%d\n",MAX);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: