题目描述:
输出格式
输出一个整数,表示可完成的最长滑雪长度。
数据范围
1≤R,C≤300
0≤矩阵中整数≤10000
输入样例:
5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
输出样例:
25
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N = 310; int f[N][N]; //状态数组,表示从i,j开始滑能滑倒的所有距离中的最大值 int h[N][N]; //滑雪场 int n,m; int st[N][N]; //该点是否搜索到 int dx[4] = {-1, 1, 0, 0}; int dy[4] = {0, 0, -1, 1}; int dfs(int x, int y) { //已经搜索了,直接返回f[x][y]这个最大值 if (st[x][y]) return f[x][y]; //否则置为该点已经搜索 st[x][y] = 1; f[x][y] = 1; //自己这个点就是一步 for (int i = 0; i < 4; i++) { int nx = x + dx[i];int ny = y + dy[i]; if (nx < 1 || nx > n || ny < 1 || ny > m) continue; if (h[nx][ny] >= h[x][y]) continue; f[x][y] = max(f[x][y],dfs(nx,ny) + 1); } return f[x][y]; } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> h[i][j]; int res = 0; //暴搜所有点如果一次可以到所有点根本一次搜索即可 //这道题可以看成一个非联通图 从一个点无所搜到所有点,只能搜到部分点,搜到的部分点一定是最大值 //因为 从1个点开始上下左右走的所有路径都是固定的,在第一此搜索中就会把从f[1][1]能搜到的所有点的f[i][j]都找出来 //因为路径是固定的,所以搜过的点不需要在 重复搜索 for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) res = max(res,dfs(i,j)); cout << res; }