算法设计与分析-10349 数字滑雪

本文介绍了一种使用深度优先搜索(DFS)算法解决下滑路径长度问题的方法,并通过记忆化处理来降低算法的时间复杂度。该算法首先确定当前位置周围四个方向中可以继续下滑的位置,然后递归地寻找这些位置的最长下滑路径。为了避免重复计算,采用了一个二维数组存储已计算过的位置的最长路径长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 一般认为这个题目属于DFS,即深搜。此题目需要记忆化处理。记忆化处理用一个数组存储部分运算的结果,避免进行重复的递归调用,降低复杂度。

解题思路:要想知道a[i][j]的最长下滑长度,必须先知道a[i][[j]周边四个结点(上下左右)中比a[i][j]小的结点的下滑长度,利用这种依赖关系构造递归函数。为避免重复计算,递归函数第一语句先判断是否已经计算过结果。算法复杂度为平方阶。(代码有防伪标签,切勿复制粘贴)

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n,m,a[105][105],dp[105][105];/**< 全局变量与数组默认值为0,dp[i][j]表示从i行j列最多滑行多远 */
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};/**< 用于找到dp[i][j]的四个邻接点 */
void dfs(int x,int y)
{
    if(dp[x][y]) /**< 已经计算过的,不重复计算 */
        return;
    dp[x][y]=1;/**< 初值为1,自身长度1 */
    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i],ny=y+dy[i];
        if(nx>0&&nx<=n&&ny>0&&ny<=n&&a[x][y]>a[nx][ny])/**< 边界检查+判定能否下滑 */
        {
            dfs(nx,ny);/**< 先计算邻接点长度 */
            dp[x][y]=max(dp[x][y],dp[nx][ny]+1);/**<  */
        }
    }
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int i,j,ans=0;
    cin>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            cin>>a[i][j];
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            if(dp[i][j]==0)/**< 如果这个点没有计算过,深搜 */
                dfs(i,j);
            ans=max(ans,dp[i][j]);
        }
    cout<<ans;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值