原题链接:信息学奥赛一本通T1280-滑雪
解题思路:
注意事项:
参考代码:
#include"bits/stdc++.h" using namespace std; // 定义全局变量,r和c分别表示行数和列数,a数组存储矩阵元素,kk数组用于记忆化搜索 int r, c, a[110][110]; // 定义方向数组dx和dy,用于表示四个方向的移动(左、右、上、下) int dx[4] = {0, 0, -1, 1}; int dy[4] = {-1, 1, 0, 0}; // 定义kk数组用于记忆化搜索,避免重复计算 int kk[110][110]; long long k(int x, int y) { // 如果该位置已经计算过,直接返回结果 if (kk[x][y] != 0) { return kk[x][y]; } // 初始化当前点的最长路径长度为1 int tt = 1; // 遍历四个方向 for (int i = 0; i < 4; i++) { // 计算新的位置坐标 int xx = x + dx[i]; int yy = y + dy[i]; // 检查新的位置是否在矩阵范围内且值大于当前值 if (xx >= 1 && xx <= r && yy >= 1 && yy <= c && a[xx][yy] > a[x][y]) { // 递归计算新位置的最长路径长度并加1 int t = k(xx, yy) + 1; // 更新当前点的最长路径长度 tt = max(tt, t); } } // 将计算结果存入kk数组 kk[x][y] = tt; // 返回当前点的最长路径长度 return tt; } int main() { // 输入矩阵的行数和列数 cin >> r >> c; // 输入矩阵的元素 for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { cin >> a[i][j]; } } // 初始化最大路径长度为0 int hi = 0; // 遍历每个矩阵元素,计算其最长递增路径长度 for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { // 计算从(i, j)位置出发的最长递增路径长度 int kkk = k(i, j); // 更新最大路径长度 hi = max(hi, kkk); } } // 输出最大路径长度 cout << hi << endl; return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复