提交时间:2025-05-05 17:25:19

运行 ID: 193030

#include<bits/stdc++.h> using namespace std; int r, c; int a[105][105]; int dp[105][105]; // dp数组用于记忆化 int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; int dfs(int x, int y) { if (dp[x][y] != 0) return dp[x][y]; // 如果已经计算过,直接返回 int max_len = 1; // 初始长度为1,即至少包含当前点 for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; // 检查边界和高度条件 if (nx >= 1 && nx <= r && ny >= 1 && ny <= c && a[nx][ny] < a[x][y]) { int current_len = dfs(nx, ny) + 1; // 递归计算相邻点的长度 max_len = max(max_len, current_len); // 更新最大值 } } dp[x][y] = max_len; // 存储计算结果 return max_len; } int main() { scanf("%d%d", &r, &c); for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { scanf("%d", &a[i][j]); } } memset(dp, 0, sizeof(dp)); // 初始化dp数组 int ans = 0; for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { ans = max(ans, dfs(i, j)); // 对每个点进行DFS,更新全局最大值 } } printf("%d\n", ans); return 0; }