题意:在一个R*C(R,C<=100)的整数矩阵上找一条数字严格递减的最长路。起点任意,但每次只能沿着上下左右4个方向之一走一格,并且不能走出矩阵外。
思路:类似于dfs,套用记忆化搜索模板
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
const int maxn = 100 + 2;
string s;
int dp[maxn][maxn];
int n,m,a[maxn][maxn];
int dx[] = {-1,0,1,0};
int dy[] = {0,-1,0,1};
int dfs(int x,int y)
{
if(dp[x][y]) return dp[x][y];
int & ans = dp[x][y];
for(int i = 0;i < 4;i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx < n && ny >= 0 && ny < m && a[nx][ny] < a[x][y])
{
ans = max(ans,dfs(nx,ny) + 1);
}
}
return ans;
}
int main()
{
int T; scanf("%d",&T);
while(T--)
{
cin>>s;
int ans = 0;
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
scanf("%d",&a[i][j]);
}
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
ans = max(ans,dfs(i,j));
}
cout<<s<<": "<<ans + 1<<endl;
}
return 0;
}