POJ
来源:互联网 发布:淘宝增值服务是什么 编辑:程序博客网 时间:2024/06/16 09:37
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
这个求最长的路径,首先想到的就是把每个点都dfs一遍输出最长,但这样做肯定会超时,
这个题每次dfs过的点就不要在dfs一遍了,每次dfs都把该点的最长路径记录下来,然后
比它高的点加上这个点再加1就是比它高的点的路径长度,然后找出最大就可以了,
就是开个数组来存路径长度(g[n]),当dfs到n的时候如果g[0] != 0,直接用g[n]加上当前长度就好
#include <iostream>#include <cstdio>#include <cstring>#include <queue>#define inf 0x3f3f3f3fusing namespace std;int map[200][200];int v[200][200];int g[200][200];int n, m, nx, ny;int sum;void dfs(int x, int y, int k){ if(g[x][y]) { g[nx][ny] = max(k - 1 + g[x][y],g[nx][ny]); sum = max(sum,g[nx][ny]); return; } g[nx][ny] = max(k,g[nx][ny]); sum = max(sum,k); v[x][y] = 1; if(x + 1 < n && !v[x+1][y] && map[x+1][y] < map[x][y]) dfs(x+1,y,k+1); if(x - 1 >= 0 && !v[x-1][y] && map[x-1][y] < map[x][y]) dfs(x-1,y,k+1); if(y + 1 < m && !v[x][y+1] && map[x][y+1] < map[x][y]) dfs(x,y+1,k+1); if(y - 1 >= 0 && !v[x][y-1] && map[x][y-1] < map[x][y]) dfs(x,y-1,k+1); v[x][y] = 0;}int main(){ int i, j; cin>>n>>m; for(i = 0;i < n;i++) { for(j = 0;j < m;j++) { cin>>map[i][j]; } } for(nx = 0;nx < n;nx++) { for(ny = 0;ny < m;ny++) { dfs(nx,ny,1); } } cout<<sum<<endl; return 0;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- HDU 6040 Hints of sd0061(nth_element)
- 对象数组排序&&对象数组去除重复数据
- (9)从站会开始
- 类的转换
- [日常训练] 独立集
- POJ
- BSGS&扩展BSGS
- 2017多校2 1004 Puzzle
- java锁学习笔记
- bootstrap轮播插件
- 字典的并集
- hdu1102 最小生成树
- 【学习笔记】熟悉并使用TypeScript的命名空间namespace
- 项目实战之使用Servlet+JSP+XML(EL表达式版)实现联系人功能