dp专题 第二十六题 滑雪

1、简单描述

输入c*r的矩阵,元素表示山头的高度,求最长滑雪的区域长度。

2、思路

#include <bits/stdc++.h>
using namespace std;

int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int r,c;
int opt[101][101];
int node[101][101];

bool ok(int i,int j)
{
    return (i>=1&&i<=r&&j>=1&&j<=c);
}                                                                                        //判断是否越界
int dp(int i,int j)
{
    int k;
    if(opt[i][j]>0) return opt[i][j];
    for(k=0;k<4;k++)
    {
        if(ok(i+dx[k],j+dy[k]))
            if(node[i+dx[k]][j+dy[k]]<node[i][j])
        {
            if(opt[i][j]<dp(i+dx[k],j+dy[k])+1)
                opt[i][j]=dp(i+dx[k],j+dy[k])+1;
        }
    }
    return opt[i][j];                                                              //计算区域长度
}
int main()
{
    
    while(cin>>r>>c)
    {
        
    int Max=-1;
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
    {
        cin>>node[i][j];
    }
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
    {
        int t = dp(i,j);
        if(Max<t)
            Max=t;
    }                                                              //输出最长区域长度
    cout<<Max+1<<endl;
    }
    return 0;

}

 

 

 

多次输入测试数据。

上下左右四个方向查找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值