传说中经典DP,记忆化搜索?其实就是在一个二维数组中求一个最长下降的子序列的长度。
其实就是从每个元素开始找以它为起始点的最长下降子序列,当递归到该点比周围所有的点都小时即返回,
自低向上的方法,注意与广搜不同,广搜是自顶向下。
以后每个点的计算都可以用到以前的结果,因为这是无后效性的?这就是传说中的记忆化?
#include <stdio.h>
#include <string.h>
#define N 105
#define INF 1 << 28
int r, c;
int h[N][N], a[N][N];
int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int dfs(int x, int y)
{
if(a[x][y]) return a[x][y];
int max = 0, t;
for(int i = 0; i < 4; i++)
{
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(xx < 0 || xx >= r || yy < 0 || yy >= c) continue;
if(h[xx][yy] < h[x][y])
{
t = dfs(xx, yy);
max = max > t ? max : t;
}
}
a[x][y] = max + 1;
return max + 1;
}
int main()
{
int ans;
while(~scanf("%d %d", &r, &c))
{
for(int i = 0; i < r; i++)
for(int j = 0; j < c; j++)
{
scanf("%d", &h[i][j]);
a[i][j] = 0;
}
ans = -INF;
for(int i = 0; i < r; i++)
for(int j = 0; j < c; j++)
{
int t = dfs(i, j);
if(t > ans) ans = t;
}
printf("%d\n", ans);
}
return 0;
}