题目的意思是 给你一个n*m的矩阵 让你从中找出一条最长的递减序列 能走四个方向 上下左右 这道题需要用到 记忆化搜索 普通搜索会超时
记忆化搜索就是在原本记录该点是否到过的数组中保存一些其他信息 比如上一次到这个点的序列长度是多少 或者直接在这个数组中保存答案 两种都可以
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 105;
int n, m;
int idx[N][N];
int mapp[N][N];
int ans ;
void dfs(int x, int y,int cnt)
{
if(cnt < idx[x][y])return ;//重要的减枝 如果上一次到这个点的时候序列长度比这一次的长 就GG!!!
idx[x][y] = cnt;
ans = max ( ans , cnt );//ans用来保存最终答案
int dir[4][2] = {{1,0},{0,1},{0,-1},{-1,0}};
for (int i = 0; i < 4; i ++) {
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(xx <= n && xx > 0 && yy <= m && yy > 0 && mapp[xx][yy] < mapp[x][y]) {
dfs(xx , yy , cnt + 1);
}
}
}
int main()
{
int t;
cin >> t ;
while (t -- ) {
cin >> n >> m ;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
cin >> mapp[i][j] ;
memset(idx , 0, sizeof(idx));
ans = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
dfs(i , j, 1);
cout << ans << endl;
}
}