3-27 OJ最長増加パス

タイトル説明

整数の行列を考えると、最も長いパス単位の長さを見つけます。
各セルについて、あなたは下、左、右方向に移動、アップすることができます。あなたは移動することはできませんまたは斜め方向外側の境界に移動すること。

エントリー

テストデータの複数の組からの試験試料。2つの正の整数nは、矩形の代表的な行と列のm個の各テスト入力線(1 <= N、M < = 500)
、次の入力数N * M、範囲INT内の各数平均内部。

輸出

出力行列の最長経路長をインクリメントします。

サンプル入力

3 3
9 4 9
6 6 8
2 1 1

サンプル出力

4

アイデア:

DFSは彼の数字よりも小さいまたは大きい見つけます。

IF(FX> = 0 && FY> = 0 && FX <N && FY <M && A [X] [Y] <[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