您的位置:首页 > 其它

uva285 - Longest Run on a Snowboard(二维最长递增子序列)

2016-03-18 23:45 357 查看
题意:

给你一二维数组,求最长降序路径

思路:

直接4个方向分别找最长路径,dp[i][j]记录下map[i][j]这个点能找到的最长路径,最后再遍历,看哪个点为起点后能找到最长的路径。再备忘即可。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;
char name
;
int map

, dp

;
const int dir[4][2] = { { 0, -1 }, { -1, 0 }, { 0, 1 }, { 1, 0 } };
int n, m;

int DP(int i, int j) {
if (dp[i][j] != -1)
return dp[i][j];
dp[i][j] = 1;
for (int k = 0; k < 4; k++) {
int x = i + dir[k][0];
int y = j + dir[k][1];
if (x<1 || x>n || y<1 || y>m)
continue;
if (map[x][y] < map[i][j])
dp[i][j] = max(dp[i][j], DP(x, y) + 1);
}
return dp[i][j];
}
int main() {
int cas;
scanf("%d", &cas);
while (cas--) {
scanf("%s",name);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &map[i][j]);
memset(dp, -1, sizeof(dp));
int maxn = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
maxn = max(maxn, DP(i, j));
printf("%s: %d\n", name, maxn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: