经典dp问题/记忆化搜索
状态:rst[x][y] 表示从坐标x,y开始获得的最大长度
状态转移方程:rst[x][y] = max(rst[xi][yi])+1; 其中xi,yi为达到x,y的合法坐标
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define DIR 4
#define MAXROW 101
#define MAXCOL 101
int row, col;
int dir[][2] = {
{1, 0}, {-1, 0}, {0, 1}, {0, -1}
};
int map[MAXROW][MAXCOL], rst[MAXROW][MAXCOL];
int depth_frist_serach(const int &x, const int &y)
{
int ans(0), tx, ty;
for(int i = 0; i < DIR; i ++) {
tx = x+dir[i][0]; ty = y+dir[i][1];
if( tx < 0 || ty < 0 || tx >= row || ty >= col || map[tx][ty] >= map[x][y]) {
continue;
}
rst[tx][ty] = (-1 == rst[tx][ty])? depth_frist_serach(tx, ty) : rst[tx][ty];
ans = max(ans, rst[tx][ty]);
}
return ans+1;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int ans;
while( ~scanf("%d %d", &row, &col) ) {
for(int i = 0; i < row; i ++) {
for(int j = 0; j < col; j ++) {
scanf("%d", &map[i][j]);
}
}
memset(rst, -1, sizeof(rst)); ans = 0;
for(int i = 0; i < row; i ++) {
for(int j = 0; j < col; j ++) {
rst[i][j] = (-1 == rst[i][j])? depth_frist_serach(i, j) : rst[i][j];
ans = max(ans, rst[i][j]);
}
}
printf("%d\n", ans);
}
return 0;
}