题意:一个滑雪场相当于一个二维数组,一个人只能从数组内大的值的位置滑到小的值的位置,问最长的滑雪距离。
题解:dp,用一个f数组储存当前点能走的最远距离,在遍历四方向的是否判断如果当前点(x,y)的最大路径值即f[x][y] + 1还没有下一个点(x1,x2)的f[x1][x2]大,那么就不用继续搜索了,否则f[x1][y1] = f[x][y] + 1。最后遍历f数组找到最大值输出。
#include <stdio.h>
#include <string.h>
const int N = 105;
int m[N][N], f[N][N], t, row, col;
char str[N];
int flagx[4] = {0, 0, -1, 1};
int flagy[4] = {-1, 1, 0, 0};
void dp(int x, int y) {
for (int i = 0; i < 4; i++) {
int x1 = x + flagx[i];
int y1 = y + flagy[i];
if (x1 < 0 || x1 >= row || y1 < 0 || y1 >= col)
continue;
if (m[x1][y1] < m[x][y]) {
if (f[x][y] + 1 < f[x1][y1])
continue;
f[x1][y1] = f[x][y] + 1;
dp(x1, y1);
}
}
}
int main() {
scanf("%d", &t);
while (t--) {
memset(f, 0, sizeof(f));
scanf("%s %d%d", str, &row, &col);
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
scanf("%d", &m[i][j]);
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
dp(i, j);
int res = f[0][0];
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
if (f[i][j] > res)
res = f[i][j];
printf("%s: %d\n", str, res + 1);
}
return 0;
}