滑雪问题(动态规划)——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
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度会减小。在上面的例子中,一条可行的滑坡为 2424-1717-1616-11(从 2424 开始,在 11 结束)。当然 2525-2424-2323-\ldots…-33-22-11 更长。事实上,这是最长的一条。
输入格式
输入的第一行为表示区域的二维数组的行数 RR 和列数 CC。下面是 RR 行,每行有 CC 个数,代表高度(两个数字之间用 11 个空格间隔)。
输出格式
输出区域中最长滑坡的长度。
输入输出样例
输入
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
这个题目的话是我从洛谷的动态规划题单里面找的,毕竟正在学习动态规划嘛。
然后的话这道题的一个转移方程也比较简单,就是一个点的最长路径长度和这个点上下左右四个点的最长路径+1中取最大值就可以了,图个省事就没有写公式。
这道题因为为了节省运算量,是需要从小到大的运算每一个点的对应路径长度,所以我们需要对每一个点的高度进行排序,但是我们同时还需要保存每一个点的坐标,所以我选择使用C语言+结构体,Python里面和结构体性质类似的字典因为我不确定能否进行字典的排序所以就没有用。
#include<stdio.h>
struct node{int x;int y;int h;
}node[105*105];int main()
{int num=0;int a[105][105];int b[105][105];int r,c;scanf("%d %d",&r,&c);for(int i=0;i<r;i++){for(int j=0;j<c;j++){b[i][j]=1;scanf("%d",&a[i][j]);node[num].x=i;node[num].y=j;node[num].h=a[i][j];num++;}} for(int i=0;i<num-1;i++){for(int j=0;j<num-1-i;j++){if(node[j].h>node[j+1].h){node[105*105]=node[j];node[j]=node[j+1];node[j+1]=node[105*105];}}}int max_num=1;for(int i=0;i<num;i++){int x=node[i].x;int y=node[i].y;int h=node[i].h;if(x>=1&&a[x-1][y]<h){b[x][y]=b[x][y]>b[x-1][y]+1?b[x][y]:b[x-1][y]+1;}if(x<c&&a[x+1][y]<h){b[x][y]=b[x][y]>b[x+1][y]+1?b[x][y]:b[x+1][y]+1;}if(y>0&&a[x][y-1]<h){b[x][y]=b[x][y]>b[x][y-1]+1?b[x][y]:b[x][y-1]+1;}if(y<r&&a[x][y+1]<h){b[x][y]=b[x][y]>b[x][y+1]+1?b[x][y]:b[x][y+1]+1;}if(b[x][y]>max_num){max_num=b[x][y];}}
// for(int i=0;i<r;i++){// for(int j=0;j<c;j++){// printf("%d ",b[i][j]);
// }
// }printf("%d",max_num);return 0;
}
许久没有用C来写代码了,说来甚是想念。
然后的话就是几个比较重要的小点,一个是数组开的大一点,我前几次就是没有反应过来node数组开小了,导致两个RE。另外就是边界的判定,防止数组下标为负,剩下的话有转移方程都比较好办。
滑雪问题(动态规划)——SHOI2002相关推荐
- [SHOI2002]滑雪 动态规划
1. Problem Description Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你. ...
- P1434 [SHOI2002]滑雪(动态规划DP)
题目描述 Michael 喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael 想知道在一个区域中 ...
- [P1434 [SHOI2002]滑雪](DFS,记忆化搜索)
P1434 [SHOI2002]滑雪 题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你 ...
- 动态规划 POJ 1088 滑雪
Description Michael 喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知 ...
- 动态规划进阶题目之滑雪
Problem F: 动态规划进阶题目之滑雪 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4 Solved: 3 [Submit][Status][ ...
- 动态规划——滑雪(洛谷 P1434)
本文讲述动态规划的经典问题--滑雪 采用递推的动态规划方式求解 先用结构体保存每个点对应的原本坐标位置和高度: 将所有点按高度从小到大排序: 用一个二维数组保存输入的原本数据, 再用一个二维数组保存对 ...
- POJ1088滑雪问题 简单dp(动态规划)已AC
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 99422 Accepted: 37756 Description ...
- 洛谷:P1434 [SHOI2002] 滑雪 题解
题目: P1434 [SHOI2002] 滑雪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本题关键字:记忆化搜索. 首先,这题为什么会想到记忆化?(知道的人直接跳过) 在dfs ...
- P1434 [SHOI2002] 滑雪
# [SHOI2002] 滑雪 ## 题目描述 Michael 喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载 ...
最新文章
- java比较语句常犯错误和三个数比较大小
- 关于编译GITHUB上的工程
- getContentResolver().query()方法selection参数使用详解(转)
- NodeJs实现自定义分享功能,获取微信授权+用户信息
- C3P0连接池问题,APPARENT DEADLOCK!!! Creating emergency..... [问题点数:20分,结帖人lovekong]...
- fatal: ‘origin‘ does not appear to be a git repository fatal: Could not read from remote repository.
- 堆排序(php实现)
- python 标签字体大小_Python玩转Excel(第3期)~这里只有干货
- ES6的一个基础类,支持私有属性和方法,支持event和mix
- C++中main函数中参数argc和argv的使用实例
- ubuntu 发布asp.net 站点(.net core)
- vb MySQL 导出_将vb中数据库的内容导出到excel中
- HTML5响应式个人简历网站模板
- α波、β波、θ波和δ波
- 关于医学影像中的轴位面(横断面)、冠状面、矢状面
- Mac笔记本鼠标滚动方向(老忘记在哪儿记录一下吧)
- Android人脸检测方案汇总
- 关于计算机二级考试C语言的心得
- keras:神经网络的中间层输出
- chained rows analyze