求助,思路找不出错。

P1434 [SHOI2002] 滑雪

LxSmill @ 2023-03-20 21:23:13

#include<bits/stdc++.h>
using namespace std;
int m[102][102];
int jm[102][102];
queue<int> a;
int r,c,num,maxnum,ans;
void search(int x,int y)
{
    if(jm[x][y])
    {
       num+=1+jm[x][y];
       return;
    }
    else
    {
       if(m[x+1][y]<m[x][y]&&x+1>=1&&x+1<=r&&y>=1&&y<=c) 
       {
          search(x+1,y);
          num++;
       }
       a.push(num);
       num=0;       
       if(m[x-1][y]<m[x][y]&&x-1>=1&&x-1<=r&&y>=1&&y<=c) 
       {
          search(x-1,y);
          num++;        
       }
       a.push(num);
       num=0;
       if(m[x][y+1]<m[x][y]&&x>=1&&x<=r&&y+1>=1&&y+1<=c) 
       {
          search(x,y+1);
          num++;
       }
       a.push(num);
       num=0;       
       if(m[x][y-1]<m[x][y]&&x>=1&&x<=r&&y-1>=1&&y-1<=c) 
       {
          search(x,y-1);
          num++;
       }
       a.push(num);
       num=0;       
    }
    maxnum=a.front();
    while(!a.empty())
    {
        a.pop();
        if(a.front()>maxnum) maxnum=a.front();
    }
    jm[x][y]=maxnum;
}
int main()
{
    cin>>r>>c;
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++) cin>>m[i][j];
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++) search(i,j);
    ans=jm[1][1];
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++) if(jm[i][j]>ans) ans=jm[i][j];
    cout<<ans<<endl;        
    return 0;
}

by LxSmill @ 2023-03-20 21:27:39

思路是这样的:遍历二维数组,把每个点的最长路径通过dfs四个方向找到,并把这个最长路径存入记忆数组,如果后续搜索搜到这个点,直接用当前已经搜到的路长度加上记忆数组里的值就是这个方向的最长值,最后在记忆数组里找最大值即为答案。请各位大佬看看代码哪里出了问题。


|