[SHOI2002]滑雪

集成嵌入式调试平台:从启动时间窗到软硬件协同的深度分析 在嵌入式系统开发中,调试是确保软件与硬件协同工作的关键环节。其核心原理在于通过实时追踪和分析系统运行时的内部状态,将软件执行流与硬件事件流在统一时间轴上关联。这一技术价值在于能够实现非侵入式的深度调试,极大提升问题定位效率。尤其在SoC和多核系统中,面对启动时序、并发竞争和性能瓶颈等复杂场景,传统的单调试手段往往力不从心。集成嵌入式调试平台通过融合芯片追踪(如CoreSight)、高速探针和智能分析引擎,提供了从概念到实践的完整解决方案。它使得开发者能够可视化系统全景,如,精准定位启动失败是源于电源序列 阅读详情

题目描述
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(1≤R,C≤100)。下面是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

解题思路:
方法一:记忆化搜索

这个方法一般很容易想得到,就是每搜索完一个高度的最长路径记录一下,以后搜索其他的点时如果走到了这条路就直接用记录的值计算就是了

方法二:dp

假设一个点的高度为H,周围四个点的高度分别为H1,H2,H3,H4,f[i][j]代表从(i,j)滑的最长长度。如果H大于周围四个点的一个,那么就可以滑到那一个点,也就是f[高的那个点]=f[矮的那个点]+1,到这里就不难写出状态转移方程了:f[i][j]=f[i+bg][j+cg]+1(前提:a[i+bg][j+cg]<a[i][j]),其中a数组为读入的高度,b、c数组为方向数组,f数组为这个点的最长路径长度。注意在计算长度之前要先将高度排序,然后再来算

方法3:剪枝

假如说当前的最大高度为maxn,搜索函数里的参数num(代表当前已经走过的长度),当前这个点的高度为heightheight。如果num+height<=maxn,那么可以直接returnreturn(注意:这里我还没有枚举周围四个点)。假设你从这个点可以一路无阻碍的走到1(也就是最优的情况),那么从这个点走的长度为height。但是如果已经走的长度加上从这个点的最优长度都小于等于最大长度的话,那么搜下去肯定是毫无意义的,果断剪枝。

除了这个以外,还可以加一个小小的剪枝(与其说是剪枝,不如说是特判):如果maxnn∗m,那么就可以直接输出答案了。因为整个地图的大小为n∗m,若maxnn∗m的话就说明可以跑完整个地图,那么最大值无论如何也不会更新了,所以说这里就可以直接输出了(说不定可以过某些测试点呢)

代码:
方法一:

#include<bits/stdc++.h>
using namespace std;
const int N = 10100;
int r,m,res,maxn,ans;
int a[N][101];
bool p[N][101]={0};
int b[4]={1,0,-1,0};
int c[4]={0,1,0,-1};
int f[N][101]={0};
void dfs(int x , int y, int num)
{
	int flag = 0;
	for(int i = 0 ; i < 4 ; i++)
	{
		int xx = x+c[i];
		int yy = y+b[i];
		if(a[xx][yy]>=a[x][y])
		  continue;
		if(f[xx][yy])
		{
			ans = max(ans,f[xx][yy]+num);
			continue;
		}
		if(xx&&xx<=r&&yy&&yy<=m&&!p[xx][yy])
		{
			p[xx][yy] = 1;
			dfs(xx,yy,num+1);
			p[xx][yy] = 0;
		}
	}
	if(!flag)
	{
		ans = max(ans,num);
		return;
	}
}
int main()
{
	cin >> r >> m;
	for(int i = 1 ; i <= r ; i++)
	{
		for(int j = 1 ; j <= m ; j++)
		{
			cin >> a[i][j];
		}
	}
	for(int i = 1; i <= r ; i++)
	{
		for(int j = 1; j <= m ; j++ )
		{
			ans = 0;
			p[i][j] = 1;
			dfs(i,j,1);
			p[i][j] = 0;
			f[i][j] = ans;
			if(maxn < ans)
			  maxn = ans;
		}
	}
	cout << maxn << endl;
	return 0;
}

方法二:

#include<iostream>
#include<cstdio>
using namespace std;
int dx[5]= {0,-1,0,1,0},dy[5]= {0,0,1,0,-1};
long long r,c,i,j,p,t,ans;
long long m[101][101],f[101][101];
int search(int,int);
int main() {
    cin>>r>>c;
    ans=0;
    for(i=1; i<=r; i++) {
        for(j=1; j<=c; j++) cin>>m[i][j];
    }
    for(i=1; i<=r; i++) {
        for(j=1; j<=c; j++) {
            t=search(i,j);
            f[i][j]=t;
            if(t>ans) ans=t;
        }
    }
    cout<<ans<<endl;
}
int search(int x,int y) {
    int i,t,tmp,nx,ny;
    if(f[x][y]>0) return f[x][y];
    t=1;
    for(i=1; i<=4; i++) {
        nx=x+dx[i];
        ny=y+dy[i];
        if((nx>=1)&&(nx<=r)&&(ny>=1)&&(ny<=c)&&(m[x][y]<m[nx][ny])) {
            tmp=search(nx,ny)+1;
            if(tmp>t) t=tmp;
        }
    }
    f[x][y]=t;
    return t;
}

方法三:

#include<cstdio>
using namespace std;
const int N=105;
int n,m,a[N][N],maxn,b[4]= {1,0,-1,0},c[4]= {0,1,0,-1};
bool p[N][N]= {0};
inline void dfs(int x,int y,int num) {
    int flag=0;
    if(a[x][y]+num<maxn) return;
    for(int i=0; i<4; i++) {
        int xx=x+c[i],yy=y+b[i];
        if(xx>0&&xx<=n&&yy>0&&yy<=m) {
            if(a[xx][yy]>=a[x][y]) continue;//跳不过去
            if(!p[xx][yy]) {
                flag=1;
                p[xx][yy]=1;
                dfs(xx,yy,num+1);
                p[xx][yy]=0;
            }
        }
    }
    if(!flag) {
        if(maxn<num) maxn=num;
        return;
    }
}
int main() {
    scanf("%d %d",&n,&m);
    for(int i=1; i<=n; i++) {
         for(int j=1; j<=m; j++) scanf("%d",&a[i][j]);
    }
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            if(maxn==n*m) {
                printf("%d\n",maxn);
                return 0;
            }
            p[i][j]=1;
            dfs(i,j,1);
            p[i][j]=0;
        }
    }
    printf("%d",maxn);
    return 0;
}
[P1434 [SHOI2002]滑雪](DFS,记忆化搜索) P1434 [SHOI2002]滑雪 题目描述 Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表高度。下面是一个子: 1 2 3 4 5 16 17 18 19 6 15 2... 阅读详情

相关推荐

别再到处找密钥了!手把手教你搞定Halcon 24.11/25.05的试用授权(附每月更新提醒)

本文详细介绍了Halcon 24.11/25.05试用授权的获取与配置方法,包括解密新版授权机制、快速配置指南、每月更新规律及多版本共存管理技巧。帮助开发者避免常见授权问题,提升工作效率,特别适合机器视觉领域的初学者和专业士。

weixin_29238147的博客 848

记忆化搜索

算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。 一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。 更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。 记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。这种方

飞雪---晨 901

MPU6050芯片 寄存器详解与配置指南(详解)

分频值越小,数据刷新越快(如分频值 = 0 时,刷新率 = 8kHz/1=8kHz)。功能:配置采样频率分频系数,控制 ADC 转换速度和数据刷新率。数据刷新率 = 陀螺仪输出时钟频率 /(1 + 分频值)

m0_74696257的博客 1392

ACM题目:skiing 分析与解答

描述Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表高度。下面是一个子 1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9一个...

ChiselStone 2674

【题解】滑雪

题目描述 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 ...

weixin_33699914的博客 407

滑雪--poj1088

#include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstring&amp;gt; using namespace std; int s[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int dp[109][109]; int a[100][100]; int n,m; int dfs(int i,int j) { if(dp[i][j]) return...

qq_42964711的博客 257

SHOI2002滑雪

SHOI2002滑雪 题目 题目描述 Michael 喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael 想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表高度。下面是一个子: 1 2 3 4 5 16 17 18 19 6 15 24 ...

A793488316的博客 391

P1434 [SHOI2002]滑雪(记忆化搜索)

P1434 [SHOI2002]滑雪(记忆化搜索) 传送门 记录一下从每个位置开的最大值即可。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e2+5; #define mst(a) memset(a,0,sizeof a) #define lx x<<1 #define rx x<<1|1 #define reg register inline void r

Harris-H的博客 664

P1434 [SHOI2002]滑雪

题解 比较简单的记忆化搜索,存储在此位置的最长距离,便于其他位置计算。 Code #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;fstream&gt; #include &lt;cstring&gt; #include &lt;cstdlib&gt; #include &lt;cmath&gt; #inclu...

蟋蟀的博客 394

P1434 [SHOI2002] 滑雪

Michael 喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael 想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表高度一个可以从某个滑向上下左右相邻四个之一,当高度减小。在上面子中,一条可行的滑坡为24−17−16−1(从24开始,在1结束)。当然252423321更长。事实上,这是最长的一条。

qq_39456436的博客 716

洛谷P1434 [SHOI2002] 滑雪--Python

上面子中,一条可行的滑坡为 $24-17-16-1$(从 $24$ 开始,在 $1$ 结束)。当然 $25$-$24$-$23$-$\ldots$-$3$-$2$-$1$ 更长。事实上,这是最长的一条。Michael 想知道在一个区域中最长的滑坡。输入的第一行为表示区域的二维数组的行数 $R$ 和列数 $C$。下面是 $R$ 行,每行有 $C$ 个数,代表高度(两个数字之间用 $1$ 个空格间隔)。对于 $100\%$ 的数据,$1\leq R,C\leq 100$。## 输入输出样 #1。

2301_80183949的博客 590

洛谷P1434 [SHOI2002] 滑雪

洛谷,C++,菜菜奋斗日记

2402_88149600的博客 407

洛谷—P1434 [SHOI2002]滑雪题解

题目链接: P1434 [SHOI2002]滑雪 解题思路: 在这道题中dfs每种情况是,可能这个之前已经搜过了,没必要再去搜索了,因此不如存储记住,就没必要再去dfs了。所以我们要记忆化搜索解决这道题。这题每个出发都有可能,所以我们每个都要开始dfs,最后取他们的最大值。用dp[maxn][maxn]去保存当前长度的最大值。 dfs部分和类似的迷宫差不多,用两个数组表示4个方向: const int dx[] = { 1,0,-1,0 }; const int dy[] = { 0,1,0,-1

NCU_tanghulu的博客 547

每日一题:P1434 [SHOI2002] 滑雪(dfs/记忆化搜索)

这并不奇怪,为了获得速度,滑的区域必须向下倾斜,而当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael 想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表高度一个可以从某个滑向上下左右相邻四个之一,当高度减小。在上面子中,一条可行的滑坡为。传送门 :[P1434 [SHOI2002] 滑雪](P1434 [SHOI2002] 滑雪)输入的第一行为表示区域的二维数组的行数。事实上,这是最长的一条。输出区域中最长滑坡的长度。

yuuujggu的博客 2295

[SHOI2002] 滑雪

Michael 喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael 想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表高度一个可以从某个滑向上下左右相邻四个之一,当高度减小。在上面子中,一条可行的滑坡为24−17−16−1(从24开始,在1结束)。当然252423321更长。事实上,这是最长的一条。

CylMK的博客 954

打卡信奥刷题(1003)用C++实现信奥 P1434 [SHOI2002] 滑雪

Michael 喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael 想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表高度一个可以从某个滑向上下左右相邻四个之一,当高度减小。在上面子中,一条可行的滑坡为24−17−16−1(从24开始,在1结束)。当然252423321更长。事实上,这是最长的一条。

Loge谈信奥--一个专注于信奥人的博客 5802

SHOI2002滑雪

击打开链接直截了当:(今天做洛谷月赛有累,不多解释了。。。) #include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;cmath&gt; #include&lt;algorithm&gt; #define fill( a ) memset( a, -1, sizeof( a ) ...

Palace_的博客 677

luoguP1434 [SHOI2002]:滑雪

P1434 [SHOI2002]滑雪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题可以用记忆搜索,也可以用dp,这里我就先讲一下dp的写法【本菜鸟学艺不精,只能写一些简单的dp】 首先,如果要想dp的话,先确定集合的含义; 这里定义集合的含义我一般喜欢从状态转移方程出手【这种方法我发现之适用于一些简单的dp】,我们可以推出一个的状态可以从上下左右4个状态入手,所以就有状态转移方程: dp[q][p]为dp[i][j]的上下左右四个方向dp值; 因为这个方程只有一个

weixin_62953519的博客 288

烽火交换机配置手册

fiberhome s4800-28t-gf-pe全千兆二层电信级以太网交换机 命令行手册 r1.0.pdf

上一篇: [USACO06FEB]数字三角形
下一篇: P1160 队列安排
小飞猪Jay
博客等级 码龄8年 1779粉丝 355原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值