暴搜改的记忆化,求指点_(:зゝ∠)_

P1434 [SHOI2002] 滑雪

Dog_Two @ 2017-12-06 19:10:18

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int mp[105][105];
int vis[105][105];
int n,m;
int ans;
int to[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int dfs(int mx,int my,int cnt){
    if(vis[mx][my]!=-1) return cnt+vis[mx][my];
    for(int i=0;i<4;i++)
        if(mx+to[i][0]!=-1&&my+to[i][1]!=-1&&mp[mx+to[i][0]][my+to[i][1]]<mp[mx][my]) 
        return dfs(mx+to[i][0],my+to[i][1],cnt+1)+1;
    return 1;
}
int main()
{
    memset(mp,-1,sizeof(mp));
    memset(vis,-1,sizeof(vis));
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;i++)
        for(register int j=1;j<=m;j++)
            scanf("%d",&mp[i][j]);
    for(register int i=1;i<=n;i++)
        for(register int j=1;j<=m;j++)
            ans=max(ans,dfs(i,j,0));
    printf("%d",ans);
    return 0;
}

↑完全错的记忆化 ↓暴搜

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int mp[105][105];
int n,m;
int ans;
int to[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int mx,int my,int cnt){
    ans=max(ans,cnt);
    for(int i=0;i<4;i++)
        if(mx+to[i][0]!=-1&&my+to[i][1]!=-1&&mp[mx+to[i][0]][my+to[i][1]]<mp[mx][my]) 
            dfs(mx+to[i][0],my+to[i][1],cnt+1);
}
int main()
{
    memset(mp,-1,sizeof(mp));
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;i++)
        for(register int j=1;j<=m;j++)
            scanf("%d",&mp[i][j]);
    for(register int i=1;i<=n;i++)
        for(register int j=1;j<=m;j++)
            dfs(i,j,0);
    printf("%d",ans);
    return 0;
}

by Dog_Two @ 2017-12-06 19:43:06

int dfs(int mx,int my,int cnt){
    if(vis[mx][my]!=-1) return cnt+vis[mx][my];
    for(int i=0;i<4;i++)
        if(mx+to[i][0]!=-1&&my+to[i][1]!=-1&&mp[mx+to[i][0]][my+to[i][1]]<mp[mx][my]) 
        return vis[mx][my]=dfs(mx+to[i][0],my+to[i][1],cnt+1)+1;
    return vis[mx][mx]=1;
}
改完仍然错······

by wjy666 @ 2017-12-06 19:57:47

在首页看你这个讨论没有标题。。。


by Dog_Two @ 2017-12-06 20:05:09

@wjy666 我注意到了,今天签到说忌开电脑23333


|