POJ 1088 滑雪(经典二维动态规划)【模板】
来源:互联网 发布:中国象棋网络高手 编辑:程序博客网 时间:2024/06/06 14:01
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
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
【分析】利用DP的思想,先求出每个点的最长下降子序列,然后遍历所有的点,找出最大的值即为所求,现在问题是这个二维的最长下降子序列怎么求,在这道题中我是用递归求的,从一点出发,上下左右四个方向分别递归,找出符合条件的点,加入到序列末尾,直到找不到符合条件的值为止,所加进来的点的个数加上本身点就是当前点的最长下降子序列,然后每个点都类似求一遍即可。
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更长。事实上,这是最长的一条。
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
输出最长区域的长度。
5 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9
25【分析】利用DP的思想,先求出每个点的最长下降子序列,然后遍历所有的点,找出最大的值即为所求,现在问题是这个二维的最长下降子序列怎么求,在这道题中我是用递归求的,从一点出发,上下左右四个方向分别递归,找出符合条件的点,加入到序列末尾,直到找不到符合条件的值为止,所加进来的点的个数加上本身点就是当前点的最长下降子序列,然后每个点都类似求一遍即可。
【AC代码】
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int N=101;int m,n,ans;int point[N][N];int dp[N][N];int max(int a,int b,int c,int d){ int x=(a>b)?a:b; int y=(c>d)?c:d; return (x>y)?x:y;}int check(int i,int j){ if(dp[i][j]>0) return dp[i][j]; int a=0,b=0,c=0,d=0; if(i-1>=1&& point[i][j]>point[i-1][j]) a = check(i-1,j); if(i+1<=m && point[i][j]> point [i+1][j]) b = check(i+1,j); if(j-1>=1 && point[i][j]> point[i][j-1]) c = check(i,j-1); if(j+1<=n && point[i][j]> point[i][j+1]) d = check(i,j+1); return dp[i][j] = max(a,b,c,d)+1;}int main(){ while(scanf("%d%d",&m,&n)!=EOF) { dp[0][0]=dp[0][1]=dp[1][0]=0; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++){ scanf("%d",&point[i][j]); dp[i][j]=0;} for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) check(i,j); ans=0; for(int i=1;i<=m;++i) for(int j=1;j<=n;++j) if(ans<dp[i][j]) ans= dp[i][j]; printf("%d\n",ans); } return 0;}
16msAC。
这种递归貌似不是最好的方法,但是我不会,还望懂的大牛指教。阅读全文
1 0
- POJ 1088 滑雪(经典二维动态规划)【模板】
- POJ 1088 滑雪(动态规划经典)
- 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)滑雪 ---- 动态规划
- POJ 1088 滑雪(动态规划)(解题报告)
- POJ 1088 滑雪(动态规划+记忆化搜索)
- java textarea 换行问题处理\n
- windows下使用keytool生成ssl自生成证书并在tomcat7中配置
- 阿里JAVA开发手册的部分收录
- 众数问题
- Java菜鸟学习日记9
- POJ 1088 滑雪(经典二维动态规划)【模板】
- WdatePicker日历控件的用法
- c++预定义类型输入输出的格式控制
- 51NOD 2006 飞行员配对(二分图最大匹配)
- php魔术方法(三)类的序列化和反序列化
- 并发基础_4_并发_线程间通信
- 开启博客技术之路
- Java实现添加压缩文件
- MySql-Limit用法