原题传送门
#include <bits/stdc++.h>
using namespace std;
int x_n, y_n;
int height[105][105];
int dis[105][105];
int movex[] = { 0,0,1,-1 };
int movey[] = { -1,1,0,0 };
int dfs(int x, int y)
{
if (dis[x][y] != 0)//如果已经搜过
{
return dis[x][y];
}
int temp = 1;//起点由题意算一个长度
for (int i = 0; i < 4; i++)
{
int xx = x + movex[i];
int yy = y + movey[i];
if (xx >= 1 && xx <= x_n && yy >= 1 && yy <= y_n && height[xx][yy] < height[x][y])
{
temp = max(temp, dfs(xx, yy) + 1);//每次取最长的,加一是因为从起点到下一个点加一步长度
}
}
dis[x][y] = temp;
return temp;
}
int main()
{
cin >> x_n >> y_n;
int final_ans = 0;
for (int i = 1; i <= x_n; i++)
{
for (int j = 1; j <= y_n; j++)
{
cin >> height[i][j];
}
}
for (int i = 1; i <= x_n; i++)
{
for (int j = 1; j <= y_n; j++)
{
dis[i][j] = dfs(i, j);
final_ans = max(dis[i][j], final_ans);
}
}
cout << final_ans << endl;
}
第一道记忆化搜索