动态规划VS记忆化搜索(2)

luoguP1434滑雪

题目描述

Michael 喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael 想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子:

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-16-1(从 24 开始,在 1 结束)。当然 25-24-23-······-3-2-1 更长。事实上,这是最长的一条。

输入格式

输入的第一行为表示区域的二维数组的行数 R 和列数 C。下面是 R行,每行有 C$个数,代表高度(两个数字之间用 1个空格间隔)。

输出格式

输出区域中最长滑坡的长度。

输入输出样例

输入

5 5

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

输出

25

说明/提示

对于 100% 的数据,1<=R,C<=100。

还是这道题,记忆化搜索已经讲完了他的题目解法,见(1)中的题目做法,但两种算法的PK仍然在继续,因为动态规划还没有出场!

有请动态规划!

记忆化搜索和我十分相似,甚至我们两个可以互相替代,我的时间更短,所以记忆化搜索应该输在我手上。至于这题,我的方法需要两个辅助,堆和opreator.

operator是一个提供运算符重载的东西,他较为复杂,常用于struct或class,本人喜欢用struct。

cpp 复制代码
struct node{
    int x,y,val;
    bool operator>(const node& o)const{
        return val>o.val;
    }
};

由于代码过于难,我也调了一天,就不让你们痛苦了。

堆也很简单,stl大法好!

cpp 复制代码
priority_queue<node,vector<node>,greater<node> >q;

输入时要把该点高度扔进堆里,初始化dp[i][j]=1。

重头戏在dp,dp无后效性,所以要从小到大进行 dp,由于dp[i][j]的定义是在i,j这个点做滑雪起点时能滑的最大坡,所以从小到大的顺序不会有后效性。然后维护方向数组,像搜索一样扩展。

代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,y,val;
    bool operator>(const node& o)const{
        return val>o.val;
    }
};
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int a[1001][1001],n,dp[1001][1001],m;
priority_queue<node,vector<node>,greater<node> >q;
int main(){
	cin>>n>>m;
	for (int i=1;i<=n;i++){
		for (int j=1;j<=m;j++){
			cin>>a[i][j];
			q.push({i,j,a[i][j]});
			dp[i][j]=1;
		}
	}
	while (q.size()){
		int x=q.top().x,y=q.top().y,val=q.top().val;
		q.pop();
		int k=dp[x][y];
		for (int i=0;i<4;i++){
			int xx=dx[i]+x,yy=dy[i]+y;
			if (val>a[xx][yy]){
				dp[x][y]=max(dp[x][y],k+dp[xx][yy]);
			}
		}
	}
	int ans=0;
	for (int i=1;i<=n;i++){
		for (int j=1;j<=m;j++){
			ans=max(ans,dp[i][j]);
		}
	}
	cout<<ans<<endl;
    return 0;
}

(如果有误在评论区留言即可)

相关推荐
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮8 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说9 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove9 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung10 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了10 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL10 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰10 小时前
C++ 排列组合完整指南
开发语言·c++·算法
代码中介商10 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法
foundbug99911 小时前
自适应滤除直达波干扰的MATLAB实现
开发语言·算法·matlab