POJ DP 百练1088 滑雪问题
2015-12-14 19:45
337 查看
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
分析:
明显的dp问题。
dp[i][j] 表示的是以(i,j)为结尾的点的最高高度,
所以dp[i][j]的初始值为1,每次考虑点(i,j)的时候就看他上下左右的四个点,dp[i][j]就取那个高度比(i,j)低并且dp最大的那个点加1.
当然了,需要先排序,从h值最小的开始
PS:这里面有一些边界需要考虑,但是采用一些特殊的方法可以免去考虑边界,具体做法参考代码
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更长。事实上,这是最长的一条。
分析:
明显的dp问题。
dp[i][j] 表示的是以(i,j)为结尾的点的最高高度,
所以dp[i][j]的初始值为1,每次考虑点(i,j)的时候就看他上下左右的四个点,dp[i][j]就取那个高度比(i,j)低并且dp最大的那个点加1.
当然了,需要先排序,从h值最小的开始
PS:这里面有一些边界需要考虑,但是采用一些特殊的方法可以免去考虑边界,具体做法参考代码
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn = 105; int a[maxn][maxn]; int dp[maxn][maxn]; struct node { int x,y,h; }A[maxn*maxn]; bool cmp(node a,node b) { return a.h<b.h; } int main() { int n,c; while(scanf("%d%d",&n,&c)==2) { memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); int num = 0; for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= c ; j++) { scanf("%d",&a[i][j]); A[num].x=i; A[num].y=j; A[num++].h = a[i][j]; dp[i][j] = 1 ; //初始条件 } } sort(A,A+num,cmp);//排序 //这样处理了之后就不用考虑边界的问题了,边界的点都比边界外的高,但是边界外面的dp初始值为0 //加上1之后还是不变 for(int k = 0 ; k < num ; k++) { int i = A[k].x; int j = A[k].y; if(a[i][j]>a[i-1][j]) dp[i][j] = max(dp[i][j],dp[i-1][j]+1); if(a[i][j]>a[i][j-1]) dp[i][j] = max(dp[i][j],dp[i][j-1]+1); if(a[i][j]>a[i+1][j]) dp[i][j] = max(dp[i][j],dp[i+1][j]+1); if(a[i][j]>a[i][j+1]) dp[i][j] = max(dp[i][j],dp[i][j+1]+1); } int ans = 0 ; for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= c ; j++) { //cout<<dp[i][j]<<" "; ans = max(ans,dp[i][j]); } //cout<<endl; } printf("%d\n",ans); } return 0; } /* Auther:LIUYAN 2015.12.14 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 */
相关文章推荐
- openwrt 编译软件包出现错误(is missing dependencies for the following libraries: libpthread.so.0)
- EditPlus 注册码在线生成
- 手机幻灯
- BZOJ 2456 mod
- websocket后台推送数据
- XML解析、Json解析
- 常用排序算法总结
- CentOS SVN SHOW LOG 只显示版本号和NO DATE的解决方法
- Java:String和Date、Timestamp之间的转换
- 关于StatusBar,TitleBar,ActionBar之间的区别以及他们的高度的计算。
- C#字符串加密
- Android开发 接入支付宝移动支付
- linux安装 mysql问题
- Ubuntu配置Maven
- 最简单的定时随机切换图片
- CF 149 D Coloring Brackets(区间DP)
- pair RDD groupByKey countByKey countByValue aggregateByKey reduceByKey 测试
- POJ-3259 Wormholes
- findViewById自定义控制时出现空指针异常
- 跟我一起写 Makefile(二)