动态规划NM---滑雪问题
2015-04-14 00:02
162 查看
滑雪问题:
高--->低,求滑行最长距离
input:第一行表示区域的行数R和列数C(1<=R,C<=100),R行C个数,代表高度h,0<=h<=10000;
output:求出最长区域的长度;
sample input:
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
sample output:
25
代码:
小结:
算法:递归-深度搜索-动态规划;
这道题类似于走迷宫类型题目,只是不定起点,但复杂度基本没有改变。类迷宫题的思路首先会想到采用动态规划打表,还不是很熟,细节的处理还要考虑半天。
高--->低,求滑行最长距离
input:第一行表示区域的行数R和列数C(1<=R,C<=100),R行C个数,代表高度h,0<=h<=10000;
output:求出最长区域的长度;
sample input:
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
sample output:
25
代码:
#include <iostream> #include <cstring> int a[101][101]; int b[101][101]; int m,n; using namespace std; int f(int x,int y) { int max1,max2; int right=0,left=0,up=0,down=0; if(b[x][y]>0) return b[x][y]; if(x-1>0&&a[x][y]>a[x-1][y]) up=f(x-1,y);//上 if(x+1<=n&&a[x][y]>a[x+1][y]) down=f(x+1,y);//下 if(y-1>0&&a[x][y]>a[x][y-1]) left=f(x,y-1);//左 if(y+1<=m&&a[x][y]>a[x][y+1]) right=f(x,y+1);//右 max1=max(right,left); max2=max(up,down); b[x][y]=max(max1,max2)+1; return b[x][y]; } int main() { int i,j,k,maxb=0; memset(b,0,sizeof(b)); while(cin>>m>>n) { maxb=0; for(i=1; i<=m; i++) for(j=1; j<=n; j++) cin>>a[i][j]; for(i=1; i<=m; i++) for(j=1; j<=n; j++) k=f(i,j); for(i=1; i<=m; i++) for(j=1; j<=n; j++) if(b[i][j]>maxb) maxb=b[i][j]; cout<<maxb<<endl; } return 0; }
小结:
算法:递归-深度搜索-动态规划;
这道题类似于走迷宫类型题目,只是不定起点,但复杂度基本没有改变。类迷宫题的思路首先会想到采用动态规划打表,还不是很熟,细节的处理还要考虑半天。
相关文章推荐
- 动态规划--最长公共子序列问题 O(nm)
- 动态规划之滑雪问题c++实现
- 动态规划解决北大 ACM 1088 滑雪问题
- 动态规划0/1背包问题
- Coins(poj1742)动态规划+挑战多重部分和问题
- 动态规划 (三) 背包问题
- 01背包问题动态规划详解
- 利用动态规划求迷宫的最优值问题
- ACM;邮局问题;动态规划;O(n3); 四边形法则可以优化,暂时没研究,等待添加;
- 动态规划之背包问题(一)
- 动态规划问题
- 动态规划思想:石子合并问题
- 简单的动态规划问题(帮助理解动态规划)
- 动态规划 问题之数字三角形(正序递推)
- 动态规划[入门3]-多重背包问题
- 动态规划——POJ1163数字三角形问题
- 动态规划--台阶问题
- 动态规划----数塔问题
- 动态规划之01背包问题
- 动态规划值游艇问题