记忆化搜索一例

洛谷P1434。本题边界处理很有趣

#include<bits/stdc++.h>
using namespace std;
int f[101][101];int n[102][102];int r,c;
int sear(int n0,int m0)
{
    if(n0==0||m0==0)return 0;
    if(n0==r+1||m0==c+1)return 0;
    if(f[n0][m0]!=-1)return f[n0][m0];
    //int max=0;
    if(n[n0][m0]>n[n0-1][m0])f[n0][m0]=1+sear(n0-1,m0);
    if(n[n0][m0]>n[n0+1][m0])f[n0][m0]=1+sear(n0+1,m0)>f[n0][m0]?1+sear(n0+1,m0):f[n0][m0];
    if(n[n0][m0]>n[n0][m0-1])f[n0][m0]=1+sear(n0,m0-1)>f[n0][m0]?1+sear(n0,m0-1):f[n0][m0];
    if(n[n0][m0]>n[n0][m0+1])f[n0][m0]=1+sear(n0,m0+1)>f[n0][m0]?1+sear(n0,m0+1):f[n0][m0];
    f[n0][m0]=f[n0][m0]>1?f[n0][m0]:1;
    return f[n0][m0];
}
int main()
{
    cin>>r>>c;
    for(int i=1;i<=r;i++)
    for(int j=1;j<=c;j++)
    {
        cin>>n[i][j];
    }
    memset(f,-1,sizeof(f));
    int max=0;
    for(int i=1;i<=r;i++)
    for(int j=1;j<=c;j++)
    {
        int temp=sear(i,j);
        if(temp>max)max=temp;
    }
    cout<<max;
    return 0;
}
posted @ 2024-09-09 21:10  邓佑孤  阅读(31)  评论(0)    收藏  举报