3-27 OJ 最长递增路径

题目描述

给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。

输入

测试样例由多组测试数据组成。每组测试数据第一行输入两个正整数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;
}

发布了34 篇原创文章 · 获赞 6 · 访问量 1337

猜你喜欢

转载自blog.csdn.net/qq_44669377/article/details/105145304
OJ