POJ

来源:互联网 发布:淘宝增值服务是什么 编辑:程序博客网 时间:2024/06/16 09:37
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


这个求最长的路径,首先想到的就是把每个点都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;}


原创粉丝点击