问题
给一个m*n(m,n<=100)矩阵,要求找到矩阵中的最长递减路径长度(从一个元素出发,可以往四个方向走,但是数字的值必须减少)
分析
DAG(有向无环图)最长路问题
填表法,记忆化搜索
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=105;
int dp[maxn][maxn],T,R,C,num[maxn][maxn];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
string s;
int DP(int i,int j){
int &ans=dp[i][j];
if(dp[i][j]>0) return ans;
ans=1;
for(int k=0;k<4;++k){
int ni=i+dx[k],nj=j+dy[k];
if(ni>=0 && ni<R && nj>=0 && nj<C && num[ni][nj]<num[i][j]){
ans=max(ans,DP(ni,nj)+1);
}
}
return ans;
}
int main(void){
cin>>T;
for(int kase=1;kase<=T;++kase){
cin>>s>>R>>C;
for(int i=0;i<R;++i){
for(int j=0;j<C;++j){
scanf("%d",&num[i][j]);
}
}
memset(dp,0,sizeof(dp));
int ans=1;
for(int i=0;i<R;++i){
for(int j=0;j<C;++j){
ans=max(ans,DP(i,j));
}
}
cout<<s<<": "<<ans<<endl;
}
return 0;
}