Description
Michael喜欢滑雪。他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。为了得到更快的速度,滑行的路线必须向下倾斜。例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
Input
输入文件 第1行: 两个数字r,c(1< =r,c< =100),表示矩阵的行列。
第2..r+1行:每行c个数,表示这个点的高度。
Output
输出文件 仅一行: 输出1个整数,表示可以滑行的最大长度。
Samples
题解:自己用了DP+递归,不是最佳办法,但个人认为比较容易理解。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int r, c, mmax;
int hight[101][101], step[101][101];
int foo(int i, int j) {
if (step[i][j] != -1)
return step[i][j];
else {
int max = 0;
if (hight[i - 1][j] < hight[i][j] && i - 1 >= 0 && max < foo(i - 1,j))
max = foo(i - 1,j);
if (hight[i + 1][j] < hight[i][j] && i + 1 < r&&max < foo(i + 1,j))
max = foo(i + 1,j);
if (hight[i][j - 1] < hight[i][j] && j - 1 >= 0 && max < foo(i,j - 1))
max = foo(i,j - 1);
if (hight[i][j + 1] < hight[i][j] && j + 1 < c&&max < foo(i,j + 1))
max = foo(i,j + 1);
step[i][j] = max + 1;
return step[i][j];
}
}
int main() {
cin >> r >> c;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++)cin >> hight[i][j];
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++)step[i][j]=-1;
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++)
step[i][j]=foo(i, j);
}
mmax = step[0][0];
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++)mmax = max(mmax, step[i][j]);
}
cout << mmax;
}