解题思路:
设dp(i,j)为从当前点的最大区域长度,则dp(i, j)是他的上下左右四个点的最大区域长度最大值加1.
// 1088.cpp
// By akito
// 0 ms
#include<iostream>
#include<string.h>
using namespace std;
struct Node {
int height;
bool visited;
int length;
};
int r, c;
Node node[102][102];
int dp(int i, int j) {
if (node[i][j].visited)
return node[i][j].length;
node[i][j].visited = true;
int top = 0, down = 0, left = 0, right = 0;
// top
if (i > 1 && node[i][j].height < node[i-1][j].height)
top = dp(i-1, j) + 1;
// down
if (i < r && node[i][j].height < node[i + 1][j].height)
down = dp(i + 1, j) + 1;
// left
if (j > 1 && node[i][j].height < node[i][j - 1].height)
left = dp(i, j - 1) + 1;
//right
if (j < c && node[i][j].height < node[i][j + 1].height)
right = dp(i, j + 1) + 1;
int temp1 = top > down ? top : down;
int temp2 = left > right ? left : right;
int max = temp1 > temp2 ? temp1 : temp2;
node[i][j].length = max;
return max;
}
int main() {
while (cin >> r >> c) {
int max = -(1 << 30);
for (int i = 1; i <= r; i ++)
for (int j = 1; j <= c; j++){
cin >> node[i][j].height;
node[i][j].visited = false;
node[i][j].length = 0;
}
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
int t = dp(i, j);
max = max > t ? max : t;
}
}
cout << max + 1 << endl;
}
return 0;
}