首页 > 其他分享 >洛谷P1434滑雪分析

洛谷P1434滑雪分析

时间:2022-11-09 16:35:09浏览次数:62  
标签:24 25 洛谷 22 23 int P1434 110 滑雪

[SHOI2002] 滑雪

题目描述

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\)-\(\ldots\)-\(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

例题分析

记忆化搜索模板题,任意路径上若已被搜索过,直接引用之前的答案(另开一个ans[][]数组存答案)不需要用bool 型数组标记,因为可能出现“环”的情况
在这里插入图片描述
例如从25->24->23->22是一条可行路线,而25->22也是一条路线,无论BFS还是DFS,25->22始终先被搜索,则25->24->23->22路线不通。

AC代码

#include<bits/stdc++.h>
using namespace std;
int r,c,mapp[110][110],v[110][110],ans[110][110],dx[5]={0,-1,0,1,0},dy[5]={0,0,1,0,-1},a[10010],b[10010];//打表
int main(){
	cin>>r>>c;
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			cin>>mapp[i][j];
		}
	}
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			memset(v,0,sizeof(v));
			memset(a,0,sizeof(a));
			memset(b,0,sizeof(b));//BFS广搜代码
			int left=1,right=1;
			a[1]=i;
			b[1]=j;
			v[i][j]=1;
			while(left<=right){
				int x=a[left],y=b[left++];
				for(int k=1;k<=4;k++){
					int nx=x+dx[k],ny=y+dy[k];
					if(nx>0&&nx<r+1&&ny>0&&ny<c+1&&mapp[nx][ny]<mapp[x][y]){
						if(ans[nx][ny]!=0){
							v[nx][ny]=v[x][y]+ans[nx][ny];//用当前点加上ans中已保存点,剪枝后可以不再重复遍历
							//因为ans中存储的答案一定是已经搜索过而得出的最长路径长度,所以不必考虑其他路线
						}
						else{
							a[++right]=nx;
							b[right]=ny;
							v[nx][ny]=v[x][y]+1;
						}
					}
				}
			}
			int maxn=0;
			for(int p=1;p<=r;p++){
				for(int q=1;q<=c;q++){
					if(v[p][q]>maxn)	maxn=v[p][q];//寻找最长路径并记录
				}
			}
			ans[i][j]=maxn;
		}
	}
	int maxnn=0;
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			if(ans[i][j]>maxnn)	maxnn=ans[i][j];//在答案中再次搜索得出最优解
		}
	}
	cout<<maxnn;
	return 0;
}

标签:24,25,洛谷,22,23,int,P1434,110,滑雪
From: https://www.cnblogs.com/Nebulary/p/16874234.html

相关文章

  • 洛谷P1605题解分析
    迷宫题目描述给定一个\(N\timesM\)方格的迷宫,迷宫里有\(T\)处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障......
  • 洛谷 P1195.口袋的天空
    题目链接:https://www.luogu.com.cn/problem/P1195今天上算法设计课,复习一下Kruskal和并查集。 放AC代码1#include<bits/stdc++.h>2usingnamespacestd;3......
  • 洛谷题单【入门1】顺序结构-B2002 Hello,World!
    题目描述编写一个能够输出 Hello,World! 的程序,这个程序常常作为一个初学者接触一门新的编程语言所写的第一个程序,也经常用来测试开发、编译环境是否能够正常工作。......
  • 洛谷-1198
    洛谷-1198思路这个!辅助解释Code#include<bits/stdc++.h>usingnamespacestd;#define_u_u_ios::sync_with_stdio(false),cin.tie(nullptr)#definecfint_o_o......
  • 洛谷-3295
    洛谷-3295题意此题为中文题面。思路这里辅助解释Code#include<bits/stdc++.h>usingnamespacestd;#define_u_u_ios::sync_with_stdio(false),cin.tie(nullp......
  • 洛谷-P2491 消防
    消防树上直径+尺取考虑答案的路径一定是在树上直径,因为离树上任意一个点最远的点一定是直径的两个点其中之一因此先\(dfs\)一下找出直径两个端点从其中一个端点出......
  • 洛谷--【P1618】三连击升级版题解 排列枚举+循环枚举+stl
    题目描述将 1,2,…,91,2,…,9 共 99 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!。输入格式......
  • 洛谷 P3287
    不难发现一定是拔高一段后缀。所以设\(f_{i,j}\)表示考虑前\(i\)个位置,拔高\(j\)次,第\(i\)个位置强制选的LIS的长度。则有\(f_{i,j}=\max\limits_{1\lex\lt......
  • 洛谷 P3951 [NOIP2017 提高组] 小凯的疑惑 题解
    LuoguP3951[NOIP2017提高组]小凯的疑惑题解注:设\(A,B\)是两个集合,则\(A\timesB\)表示\(A\)与\(B\)的笛卡儿积(直积)。笛卡儿积的定义为\(S\timesM:=\{(s......
  • 洛谷 P2606 [ZJOI2010]排列计数 题解
    LuoguP2606[ZJOI2010]排列计数题解题目描述称一个\(1\simn\)的排列\(p_1,p_2,\dots,p_n\)是Magic的,当且仅当\[\foralli\in[2,n],p_i>p_{\lfloori/2......