acm DP经典题目 滑雪问题 【DP 记忆化搜索 递归】
2015-04-01 22:06
204 查看
滑雪问题
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。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
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
分析:dp入门题
#include<iostream> #include<cstdio> #include<cstring> #include<ctime> #include<algorithm> #include <map> #include <set> using namespace std; //2015.4.1 //滑雪问题 最长下降子序列 记忆化搜索 递归 int r,c; int a[105][105]; int ma[105][105]; int w[4]={0,0,1,-1}; int h[4]={1,-1,0,0}; int find(int i,int j) { int m=0; if(ma[i][j]) { return ma[i][j]; } for(int k=0;k<4;k++) { int p=i+w[k]; int q=j+h[k]; if(a[i][j]>a[p][q]&&p>0&&p<=r&&q>0&&q<=c&&m<find(p,q)) { m=find(i+w[k],j+h[k]); } } return ma[i][j]=m+1; } int main() { while(true) { cin>>r>>c; int ans=0; memset(ma,0,sizeof(ma)); for(int i=1;i<=r;i++) { for(int j=1;j<=c;j++) { cin>>a[i][j]; } } for(int i=1;i<=r;i++) { for(int j=1;j<=c;j++) { find(i,j); } } for(int i=1;i<=r;i++) { for(int j=1;j<=c;j++) { if(ans<ma[i][j]) { ans=ma[i][j]; } } } cout<<ans<<endl; } return 0; }
相关文章推荐
- 经典DP题目-滑雪问题
- 入门经典--硬币问题dp递归加递推
- 0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276
- 经典dp入门---滑雪---自己看的递推,课件给的递归,先整理个递推吧--
- hdu-1078 FatMouse and Cheese (and) 滑雪问题(记忆化搜索+简单dp)
- 0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276
- NYOJ 题目16 矩形嵌套 dp(经典dp,简单,记忆化搜索)
- 喵哈哈村的秘境探险(三)-(记忆化搜索)->经典滑雪问题
- hdu-1078 FatMouse and Cheese (and) 滑雪问题(记忆化搜索+简单dp)
- 0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276
- [递归经典题目]八皇后问题
- 0-1背包问题经典算法(递归实现)
- 经典的农夫养牛题目,C语言,递归实现
- 动态规划入门(一) DP 基本思想 具体实现 经典题目
- 动态规划入门(四)DP 基本思想 具体实现 经典题目 POJ1160 POJ1037
- poj 1088 经典dp 滑雪
- 学习笔记---递归的代码,解决经典的汉诺塔问题
- 三色旗问题(数据结构题目)dp
- boj 1343汉诺塔 递归问题 多谢大牛的代码和讲解 我需要多联系类似题目
- 关于国际象棋皇后的递归问题——经典为8皇后