题目描述
给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。
输入
测试样例由多组测试数据组成。每组测试数据第一行输入两个正整数n,m代表矩形的行数和列数( 1 <= n,m <= 500 )
接下来输入n * m 个数,每个数均在int范围内。
输出
输出矩阵中的最长递增路径长度。
样例输入
3 3
9 9 4
6 6 8
2 1 1
样例输出
4
思路:
dfs找比他小或者大的数字。
if( fx >= 0 && fy >= 0 && fx < n && fy < m && a [ x ] [ y ] < a [ fx ][ fy ] ) {
dp [ x ] [ y ] = max ( dp [ x ] [ y ] , dfs ( fx , fy ) + 1 ) ;
}
数据比较大就把使用过的存下来
if(dp[x][y])return dp[x][y];
AC代码:
#include<bits/stdc++.h>
using namespace std;
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int a[505][505];
int dp[505][505];
int n,m,s;
int dfs(int x,int y){
if(dp[x][y])return dp[x][y];
dp[x][y]=1;
int fx,fy;
for(int z=0;z<4;z++){
fx=x+dir[z][0];
fy=y+dir[z][1];
if(fx>=0&&fy>=0&&fx<n&&fy<m&&a[x][y]<a[fx][fy]){
dp[x][y]=max(dp[x][y],dfs(fx,fy)+1);
}
}
return dp[x][y];
}
int main(){
while(cin>>n>>m){
memset(a,0,sizeof a);
memset(dp,0,sizeof dp);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}s=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
s=max(s,dfs(i,j));
}
}
cout<<s<<endl;
}
return 0;
}