动态规划记忆化搜索之滑雪

简介: 动态规划记忆化搜索之滑雪

给定一个 R 行 C 列的矩阵,表示一个矩形网格滑雪场。


矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。


一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。


当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。

下面给出一个矩阵作为例子:

 1  2  3  4 5
 
16 17 18 19 6
 
15 24 25 20 7
 
14 23 22 21 8
 
13 12 11 10 9

在给定矩阵中,一条可行的滑行轨迹为 24−17−2−1。


在给定矩阵中,最长的滑行轨迹为 25−24−23−…−3−2−1,沿途共经过 25 个区域。


现在给定你一个二维矩阵表示滑雪场各区域的高度,请你找出在该滑雪场中能够完成的最长滑雪轨迹,并输出其长度(可经过最大区域数)。


输入格式

第一行包含两个整数 R 和 C。


接下来 R 行,每行包含 C 个整数,表示完整的二维矩阵。


输出格式

输出一个整数,表示可完成的最长滑雪长度。


数据范围

1≤R,C≤300

0≤矩阵中整数≤10000

输入样例:
1. 5 5
2. 1 2 3 4 5
3. 16 17 18 19 6
4. 15 24 25 20 7
5. 14 23 22 21 8
6. 13 12 11 10 9
输出样例:
25

思路:关键在于记忆化搜索,就是Z采用递归的思想,f[i,j]暂时求不出来,用递归函数dp[i,j]表示,当满足条件向右滑行时,f[i,j]=f[i,j+1]+1;

要选择前后左后四个方向的最大值即是题意

所以取f[i,j]的最大值就是如下图中max(f(i,j+1),f(i-1,j),f(i,j-1),f(i+1,j))

又因为f(i,j)往下递推的值都不知道,所以用dp数组来保存,这是和一般动态规划问题的区别


完整代码:

#include <iostream>
#include <cstring>
using namespace std;
int n,m;
const int N=310;
int f[N][N],h[N][N];
 
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
 
int dp(int x,int y){
    int &v=f[x][y];
    if(v!=-1)return v;
    v=1;
    for(int i=0;i<4;i++)
    {
        int a=x+dx[i],b=y+dy[i];
        if(a>=1&&a<=n&&b>=1&&b<=m&&h[a][b]<h[x][y])v= max(v,dp(a,b)+1);
    }
    return v;
}
 
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>h[i][j];
    int res=0;
    memset(f,-1,sizeof f);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            res=max(res,dp(i,j));
    cout<<res;
}
相关文章
|
3月前
|
机器学习/深度学习 消息中间件 Kubernetes
动态规划-线性DP问题总结(一)
动态规划-线性DP问题总结(一)
|
2月前
|
存储
【洛谷 P2437】蜜蜂路线 题解(递归+记忆化搜索+高精度)
蜜蜂路线问题:蜜蜂从蜂房$m$到$n$($m&lt;n$)按数字递增爬行。给定$m$和$n$,求路线数。示例:$m=1$,$n=14$,输出$377$。100%数据$1\leq m,n\leq1000$。使用斐波那契序列优化,高精度处理大数。代码实现斐波那契存储并动态规划求解。
26 0
|
3月前
|
消息中间件 Kubernetes NoSQL
动态规划-线性DP问题总结(二)
动态规划-线性DP问题总结(二)
|
3月前
|
机器学习/深度学习 算法 C++
【动态规划】C++算法:403.青蛙过河
【动态规划】C++算法:403.青蛙过河
|
C++
【LeetCode343】剪绳子(动态规划)
(1)确定状态 dp[i]是将正整数i拆成2个及其以上的正整数后,求所有数的乘积值。
128 0
【LeetCode343】剪绳子(动态规划)
动态规划:分组背包问题
动态规划:分组背包问题
79 0
|
算法
算法简单题,吾辈重拳出击 - 动态规划之爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
|
算法
动态规划—区间DP(一)
AcWing算法提高课内容,本文讲解 动态规划
167 0
动态规划—区间DP(一)
|
算法
动态规划—区间DP(二)
AcWing算法提高课内容,本文讲解 动态规划
150 0
动态规划—区间DP(二)