30pts求调!(玄3关)
查看原帖
30pts求调!(玄3关)
931664
sieve楼主2024/7/6 13:58
#include<bits/stdc++.h>
#define i1n for(int i=1;i<=n;++i)
#define j1m for(int j=1;j<=m;++j)
#define ll long long
using namespace std;
ll n,m,a[1005][1005],dp[1005][1005];
bool vis[1005][1005];
ll maxi(ll x,ll y)
{
	return x>=y?x:y;
}
ll dfs(ll x,ll y)
{
	if(x<1||y<1||x>n||y>m||vis[x][y])
		return 0;
	if(dp[x][y]!=-1)
		return dp[x][y];
	ll mx=-9e18;
	vis[x][y]=true;
	if(dp[x-1][y]<a[x][y]) mx=maxi(mx,dfs(x-1,y));
	if(dp[x][y-1]<a[x][y]) mx=maxi(mx,dfs(x,y-1));
	if(dp[x+1][y]<a[x][y]) mx=maxi(mx,dfs(x+1,y));
	if(dp[x][y+1]<a[x][y]) mx=maxi(mx,dfs(x,y+1));
	vis[x][y]=false;
	return dp[x][y]=mx+1;
}
int main()
{
	memset(dp,-1,sizeof(dp));
	cin>>n>>m;
	i1n
	{
		j1m
		{
			cin>>a[i][j];
		}
	}
	ll mx=-9e18;
	i1n
	{
		j1m
		{
			mx=max(mx,dfs(i,j));
		}
	}
	cout<<mx;
	return 0;
}

我用记搜写的

2024/7/6 13:58
加载中...