368K |
0MS |
GCC |
817B |
2009-01-12 18:56:19 |
best[i][j]存放从i,j开始点处开始走的最长距离。
对于给定点i,j都深搜其周围的符合条件的点
即dp(i+1,j),dp(i-1,j),dp(i,j+1),dp(i,j-1)
我的程序对于最长距离为1的起点,没有记忆性。不过最长距离为1,那么其周围四个点都要比它大,只要四次判断就可以,不会占用太多时间。
代码如下:
Code
#include<stdio.h>
int r,c,num[102][102],best[102][102];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void input()
{
int i,j;
scanf("%d %d",&r,&c);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
scanf("%d",&num[i][j]);
}
void init()
{
int i,j;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
best[i][j]=1;
}
int test(int i,int j)
{
return i>=1&&i<=r&&j>=1&&j<=c;
}
int dp(int i,int j)
{
int k,a,b;
if(best[i][j]>1) return best[i][j];
for(k = 0; k < 4; k ++){
if(test(i+dx[k],j+dy[k])){
a=i+dx[k];b=j+dy[k];
if(num[a][b]<num[i][j]&&dp(a,b)+1>best[i][j])
best[i][j]=dp(a,b)+1;
}
}
return best[i][j];
}
int main()
{
int max=-999999,i,j;
input();
init();
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
if(dp(i,j)>max)
max=dp(i,j);
printf("%d\n",max);
}