vijos1011题解
来源:互联网 发布:生理期会情绪低落知乎 编辑:程序博客网 时间:2024/05/29 10:22
题目:
顺治喜欢滑雪,这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待太监们来载你。顺治想知道载一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子:
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后,又重复地扫了好几遍,最后还是错了一个点。令我印象深刻的是陈卓凡大神,一个搜索0ms全过!!
站在现在的立场,此题还是挺容易的。当时我怎么也理解不了为什么标程的DP要排序,而现在在思考的时候,就发觉排序是一定要的!我们先从大到小把每个值排一遍(当然同时要记录每个位置的坐标),然后从大到小去对每一个高度操作。对每个高度开一个f[i][j]表示到这个点最多能划的长度。每次操作时,寻找这个点四周的点,如果那个点比当前的点高(由于是从大到小排序的,比他高的点一定在之前已经处理过了),就更新。可能CZF大神的搜索与我的原理一致吧。
代码:
#include<stdio.h>using namespace std;longf[501][501],n,m,x[250001],y[250001],a[250001],i,j,ord,data[501][501],xx,yy,ans;void qsort(int l,int r){ int i,j,xx,yy,zz; if(l>=r) return; i=l; j=r; xx=a[i];yy=x[i];zz=y[i]; while(i!=j) { while(a[j]>xx&&j>i) j--; if(i<j) { a[i]=a[j];x[i]=x[j];y[i]=y[j]; i++; } while(a[i]<xx&&j>i) i++; if(i<j) { a[j]=a[i];x[j]=x[i];y[j]=y[i]; j--; } } a[i]=xx;x[i]=yy;y[i]=zz; qsort(l,j-1); qsort(i+1,r);}long max(long a,long b){ if (a>b) return a;return b;}int main(){ scanf("%ld %ld",&n,&m); for (i=1;i<=n;i++) for (j=1;j<=m;j++) { scanf("%ld",&data[i][j]); f[i][j]=1; ord=(i-1)*m+j; a[ord]=data[i][j]; x[ord]=i;y[ord]=j; } qsort(1,ord); for (i=ord;i>0;i--) { xx=x[i];yy=y[i]; if(xx>1&&data[xx-1][yy]>data[xx][yy])f[xx][yy]=max(f[xx][yy],f[xx-1][yy]+1); if(xx<n&&data[xx+1][yy]>data[xx][yy])f[xx][yy]=max(f[xx][yy],f[xx+1][yy]+1); if(yy>1&&data[xx][yy-1]>data[xx][yy])f[xx][yy]=max(f[xx][yy],f[xx][yy-1]+1); if(yy<m&&data[xx][yy+1]>data[xx][yy])f[xx][yy]=max(f[xx][yy],f[xx][yy+1]+1); if (f[xx][yy]>ans)ans=f[xx][yy]; } printf("%ld",ans);}
0 0
- vijos1011题解
- vijos1011【动态规划】
- 题解
- 题解
- 题解
- 题解
- 题解
- 题解
- 题解
- 题解
- 题解
- 题解
- 题解
- 题解~~~~
- 题解。。。。
- 题解
- 题解
- 1002 题解
- 关于Android Application知识
- OJ_1094
- Eclipse 下出现 This compilation unit is not on the build path of a Java Project 解决
- 冒泡算法(java)
- iOS中消息的传递机制
- vijos1011题解
- OJ_1095 2的幂次方
- [博弈]HDU 1527 取石子游戏
- 常见算法在实际项目中的应用
- mysql式图详解
- C实现单链表常用操作及与数组相互格式转换
- 没有乔布斯的日子里,苹果都做了什么
- jquery组件使用遇到的问题
- VS2010中release设置断点调试