POJ——Problem1088(滑雪,动态规划)
来源:互联网 发布:itc智能网络广播 编辑:程序博客网 时间:2024/06/11 19:34
滑雪
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 101673 Accepted: 38685
Description
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
Input
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
Output
输出最长区域的长度。
Sample Input
5 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9
Sample Output
25
解题思路
题意为,给出一个二维数组,让你求出最长递减序列长度,可以四个方向行走,起点任意。要对于每个点,都算出到达1的最长路径。
如果单纯的递归,会超时,时间限制只有1000ms,所以加点小技巧,每次第一次访问一个点,就记录它到达1的最长路径,当下次访问时,就直接返回记录的值。即用一个数组dis[101][101]存储每个节点的最长路径,先初始化为0,每当访问一个节点时,就判断dis值是否大于0,大于0则此点的值就是dis的值,直接返回。
示例代码#include<iostream> using namespace std; int map[101][101]={0};//存原始数据 int r,c;//行数,列数 int dis[101][101]={0};//存储节点的最长路劲值 int f(int form,int to){ if(dis[form][to]>0)return dis[form][to];//如果已经记录了值,直接返回 int zuo=0,you=0,shang=0,xia=0; if(form+1<=r){//处理上路 if(map[form+1][to]<map[form][to])shang=1+f(form+1,to); else shang=1; } else shang=1; if(form-1>=1){//处理下路 if(map[form-1][to]<map[form][to])xia=1+f(form-1,to); else xia=1; } else xia=1; if(to+1<=c){//处理右路 if(map[form][to+1]<map[form][to])you=1+f(form,to+1); else you=1; } else you=1; if(to-1>=1){//处理左路 if(map[form][to-1]<map[form][to])zuo=1+f(form,to-1); else zuo=1; } else zuo=1; if(zuo<you)zuo=you; if(zuo<shang)zuo=shang; if(zuo<xia)zuo=xia; return zuo;//返回最大值 } int main(){ int i,j; cin>>r>>c; for(i=1;i<=r;i++) for(j=1;j<=c;j++) cin>>map[i][j]; int sun=0; for(i=1;i<=r;i++) for(j=1;j<=c;j++){ dis[i][j]=f(i,j);//记录每个节点的最长路劲 if(sun<dis[i][j])sun=dis[i][j];//选出最大长度 } cout<<sun<<endl; return 0; }更好的做法:用[4][2]数组来表示方向,到时候用(for int i=0;i<4;i++)来遍历4个方向。//循环出四个方面的最长序列然后len[i][j]=max(len[上],下,左,右)+1; #include <iostream> #define N 101 using namespace std; int map[N][N],len[N][N]; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; int r,c; int dp(int i,int j){ if(len[i][j]!=0)return len[i][j]; int maxx=0,s; for(int t=0;t<4;t++){ int temx=i+dir[t][0],temy=j+dir[t][1]; if(temx>=0&&temx<r&&temy>=0&&temy<c&&map[temx][temy]<map[i][j]){ s=dp(temx,temy); if(s>maxx)maxx=s; } } len[i][j]=maxx+1; return maxx+1; } int main(){ cin>>r>>c; int mx=-1; memset(len,0,sizeof(len)); for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ cin>>map[i][j]; } } for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ len[i][j]=dp(i,j); if(len[i][j]>mx){ mx=len[i][j]; } } } cout<<mx; return 0; }
阅读全文
0 0
- POJ——Problem1088(滑雪,动态规划)
- poj 1088滑雪 (动态规划)
- POJ 1088 滑雪(动态规划经典)
- POJ 1088 - 滑雪(动态规划)
- POJ 1088 Java:滑雪(动态规划)
- 动态规划 :POJ 1088 滑雪
- poj 1088 滑雪 动态规划
- POJ 1088 滑雪 -- 动态规划
- POJ 1088 滑雪 动态规划
- POJ-1088 滑雪 (动态规划)
- 【动态规划】[POJ 1088]滑雪
- poj 1088 滑雪 动态规划
- poj 1088 滑雪【动态规划】
- poj 1088 滑雪 动态规划
- [POJ](1088)滑雪 ---- 动态规划
- 滑雪(动态规划)
- 滑雪(动态规划)
- 滑雪(动态规划)
- PL/SQL Developer使用技巧、快捷键
- HTML——button实现链接式跳转
- 【SpringMVC】配置逻辑视图名
- Ubuntu解决sudo: source: command not found错误
- 小波变换教程(十一)
- POJ——Problem1088(滑雪,动态规划)
- Ionic3学习笔记(九)关于 Android 端软键盘弹出后界面被压缩的问题
- mybatis TypeHandler详解
- Wireshark 的使用 —— 过滤器(filter)
- openAI gym5
- 今日小结
- 5.3.3 日期/时间组件方法
- Apache的虚拟主机、内部访问控制及支持语言
- linux系统如何安装adobe flash player