P1434 滑雪

/* 
题型:记忆化动归 
注意哪里return,返回的是一个i,j的dp的值   
*/   
  
#include<cstdio>  
#include<algorithm>  
using namespace std;  
const int maxn=102;  
int n,m;  
int map[maxn][maxn];  
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//方向数组  
int ans=0;  
int f[maxn][maxn];  
bool jilu[maxn][maxn];  
int dp(int x,int y)//一个i,j的dp   
{  
    if(jilu[x][y]) return f[x][y];//记忆化   
    jilu[x][y]=1;//即visited或mark   
    int tp=0;  
    for(int i=0;i<4;i++)  
    {  
        int newx=x+d[i][0];  
        int newy=y+d[i][1];  
        if(map[newx][newy]<map[x][y] && newx>=1 && newy>=1 && newx<=n && newy<=m)//判断出界   
          tp=max(tp,dp(newx,newy));  
    }  
    f[x][y]=tp+1;//等都判断完了,路程加本身的1   
    return f[x][y];  
}  
int main()  
{  
    scanf("%d%d",&n,&m);//长宽   
    for(int i=1;i<=n;i++)  
    {  
        for(int j=1;j<=m;j++)  
         scanf("%d",&map[i][j]);  
    }  
    for(int i=1;i<=n;i++)  
    {  
        for(int j=1;j<=m;j++)  
         ans=max(ans,dp(i,j));//ans记录所有f(i,j)的最大值,由于记忆化的存在,多次调用dp并不会很慢  
    }  
    printf("%d",ans);  
    return 0;  
}   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值