題目地址:
http://bailian.openjudge.cn/practice/1088
Version 1.0 (2014-11-13)
Memory = 520 kb
Time = 0 ms
#include <stdio.h>
int Matrix[500][500];
int MaxApproach[500][500];
int m, n;
#define Valid(x, y) ((x) >= 0 && (x) < m && (y) >= 0 && (y) < n)
inline int max(int a, int b, int c, int d)
{
int max = a;
if (b > max) max = b;
if (c > max) max = c;
if (d > max) max = d;
return max;
}
int GetMaxApproach(int x, int y)
{
int top = 0, bottom = 0, left = 0, right = 0;
if (MaxApproach[x][y] > 1) return MaxApproach[x][y];
if (Valid(x, y+1) && Matrix[x][y+1] < Matrix[x][y]) bottom = GetMaxApproach(x, y+1);
if (Valid(x, y-1) && Matrix[x][y-1] < Matrix[x][y]) top = GetMaxApproach(x, y-1);
if (Valid(x-1, y) && Matrix[x-1][y] < Matrix[x][y]) left = GetMaxApproach(x-1, y);
if (Valid(x+1, y) && Matrix[x+1][y] < Matrix[x][y]) right = GetMaxApproach(x+1, y);
MaxApproach[x][y] = max(top, bottom, left, right) + 1;
return MaxApproach[x][y];
}
int main()
{
scanf("%d %d", &m, &n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &Matrix[i][j]);
MaxApproach[i][j] = 1;
}
}
int Max = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
GetMaxApproach(i, j);
if (MaxApproach[i][j] > Max) Max = MaxApproach[i][j];
}
}
printf("%d", Max);
return 0;
}