动态规划,求任一点的最长降序串长度,等于周围的 点的最长降序串的长度的最大值加一。而总有一点是的周围点的高度,都小于等于它。但是第一次提交的时候我居然把 横行,纵列的数据输入反了。。。|||
#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;
}