90分超时求助

P1434 [SHOI2002] 滑雪

Y_Morii @ 2022-07-14 08:47:39

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,ma=0;
int a[101][101];
bool f[101][101];
int fxszx[]={0,0,1,-1};
int fxszy[]={1,-1,0,0};
void dfs(int dx,int dy,int t)
{
  if(t>ma)ma=t;
  for(int i=0;i<4;i++)
  {
    int x=dx+fxszx[i];
    int y=dy+fxszy[i];
    if(x<1||y>m||x>n||y<1)continue;
    if(a[x][y]>a[dx][dy])
    {
      f[x][y]=true;
      dfs(x,y,t+1);
    }
  }
  return;
}
int main()
{
  cin>>n>>m;
  for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
      scanf("%d",&a[i][j]);
  for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
      if(f[i][j])continue;
      dfs(i,j,1);
    }
  cout<<ma;
  return 0;
}

by Wyyds @ 2022-07-14 09:26:58

@Y_Morii

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,ma=0;
int a[101][101],s[101][101],mx;
bool f[101][101];
int fxszx[]={0,0,1,-1};
int fxszy[]={1,-1,0,0};
int dfs(int dx,int dy)
{
  if(s[dx][dy])
  {
    return s[dx][dy];
  }
  s[dx][dy]=1;
  for(int i=0;i<4;i++)
  {
    int x=dx+fxszx[i];
    int y=dy+fxszy[i];
    if(x<1||y>m||x>n||y<1)continue;
    if(a[x][y]>a[dx][dy])
    {
        dfs(x,y);
        s[dx][dy]=max(s[dx][dy],s[x][y]+1);
    }
  }
  return s[dx][dy];
}
int main()
{
  cin>>n>>m;
  for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
      scanf("%d",&a[i][j]);
  for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
      mx=max(mx,dfs(i,j));
    }
  cout<<mx;
  return 0;
}

by Wyyds @ 2022-07-14 09:29:08

@Y_Morii

要用记忆化搜索,把找到的存下来


by Y_Morii @ 2022-07-14 09:52:10

谢谢dalao


|