洛谷 P1732 活蹦乱跳的香穗子

题目描述

香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值

跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她只能往价值更高(这里是严格的大于)的格子跳.

香穗子可以从任意的格子出发,在任意的格子结束,

那么她最多能跳几次?

输入输出格式

输入格式:

 

第一行n,m,表示田野的长和宽

接下来n行,每行m个数,表示该格的价值

 

输出格式:

 

一个数,表示最多跳得次数

 

输入输出样例

输入样例#1:
2 2
2 5
-1 3
输出样例#1:
2

说明

n,m<=100

答案保证小于Maxlongint

 

屠龙宝刀点击就送

记忆化搜索 

#include <cstdio>
long long f[1510][1510],value[1510][1510];
long long n,m,maxn=-1;
long long fx[5]={1,-1,0,0},fy[5]={0,0,-1,1};
long long max(long long a,long long b)
{
    return a>b?a:b;
}
long long qr(long long &x)
{
    x=0;bool f=1;
    char ch=getchar();
    while(ch>'9'||ch<'0')
    {
        if(ch=='-') f=0;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+(long long)ch-48;
        ch=getchar();
    }
    x=f?x:(~x)+1;
}
long long dfs(long long u,long long v)
{
    if(f[u][v]) return f[u][v];
    long long p=0;
    for(long long i=0;i<4;++i)
    {
        long long x=u+fx[i],y=v+fy[i];
        if(x>=1&&x<=n&&y>=1&&y<=m&&value[x][y]>value[u][v])
        p=max(dfs(x,y),p);
    }
    f[u][v]=p+1;
    return f[u][v];
}
int main()
{
    qr(n);
    qr(m);
    for(long long i=1;i<=n;i++)
        for(long long j=1;j<=m;++j)
            qr(value[i][j]);
    for(long long i=1;i<=n;i++)
        for(long long j=1;j<=m;++j)
            maxn=max(maxn,dfs(i,j));
    printf("%lld",maxn-1);
    return 0;
}

 

posted @ 2017-04-08 08:09  杀猪状元  阅读(551)  评论(0编辑  收藏  举报