蒟蒻求助,#1 和 #2 WA 了
查看原帖
蒟蒻求助,#1 和 #2 WA 了
547908
NightTide楼主2021/12/11 15:10

写的是记忆化搜索

#include<bits/stdc++.h>
#define MAXN 710
using namespace std;
const int mve[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct edge{
    int pre,to;
};
int n,m;
int high[MAXN][MAXN],num[MAXN][MAXN];
edge e[MAXN*MAXN*4];
int head[MAXN*MAXN],cnt;
bool vis[MAXN*MAXN],ski[MAXN][MAXN];
int dis[MAXN*MAXN];
char type[5];
int a,b,c,d;
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
       if(ch=='-'){
           w=-1;
        }
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0',ch=getchar();
    }
   return s*w;
}
void add_edge(int u,int v){
    e[++cnt].pre=head[u];
    e[cnt].to=v; head[u]=cnt;
}
void build(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            for(int k=0;k<4;k++){
                // if(ski[i][j]||ski[i+mve[k][0]][j+mve[k][1]]) continue;
                if(i+mve[k][0]<1||i+mve[k][0]>n||j+mve[k][1]<1||j+mve[k][1]>m) continue;
                dis[num[i][j]]=1;
                if(high[i][j]>high[i+mve[k][0]][j+mve[k][1]]){
                    add_edge(num[i][j],num[i+mve[k][0]][j+mve[k][1]]);
                }
            }
        }
    }
}
void dfs(int now){
    int res=0;
    vis[now]=true;
    for(int i=head[now];i;i=e[i].pre){
        if(vis[e[i].to]) res=max(res,dis[e[i].to]);
        else{
            dfs(e[i].to);
            res=max(res,dis[e[i].to]);
        }
    }
    dis[now]+=res;
}
int main(){
    // freopen("ski.in","r",stdin);
    // freopen("ski.out","w",stdout);
    // n=read();
    // m=read();
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&high[i][j]);
            // high[i][j]=read();
            num[i][j]=n*(i-1)+j;
        }
    }
    //建图
    build();
    int ans=0;
    for(int i=1;i<=n*m;i++) dis[i]=1;
    //记忆化搜索
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(!vis[num[i][j]]){
                dfs(num[i][j]);
                ans=max(ans,dis[num[i][j]]);
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}                     
2021/12/11 15:10
加载中...