NYOJ skiing

来源:互联网 发布:小米4c后盖淘宝 编辑:程序博客网 时间:2024/05/20 00:13

skiing

时间限制:3000 ms  |  内存限制:65535 KB
难度:5
描述
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 
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更长。事实上,这是最长的一条。
输入
第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
后面是下一组数据;
输出
输出最长区域的长度。
样例输入
15 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9
样例输出
25
来源

经典题目


思路:

        用递归,和深搜

        book标记每一点可以走的长度,刚接触不太熟,

#include<stdio.h>#include<string.h>int n,m,a[110][110],book[110][110];int max(int a,int b,int c,int d){    if(a<b) a=b;    if(a<c)a=c;    return a>d?a:d;}int dfs(int x,int y,int front){    if(x<1||y<1||x>n||y>m||front<=a[x][y])        return 0;    if(book[x][y]>=0)        return book[x][y];        //向四个方向扩散,并找到最大的返回值,并加1;    book[x][y]=max(dfs(x+1,y,a[x][y]),dfs(x-1,y,a[x][y]),dfs(x,y+1,a[x][y]),dfs(x,y-1,a[x][y]))+1;    return book[x][y]; //返回在这个点的可以走过的长度}int main(){    int t;    scanf("%d",&t);    while(t--)    {         memset(book,-1,sizeof(book));//book用来标记走过的路径长度        int i,j,term=0,k,max1=-9999;        scanf("%d %d",&n,&m);        for(i=1;i<=n;i++)            for(j=1;j<=m;j++)            scanf("%d",&a[i][j]);        for(i=1;i<=n;i++)        {            for(j=1;j<=m;j++)            {                term=dfs(i,j,11000);//term表示在每一点可以走的长度                if(term>max1)                    max1=term;      //记录最长的            }        }        printf("%d\n",max1);    }    return 0;}

这个题我做过很久了,今天考试又考这道题,还是同样的记忆化搜索,不过方法都差不多,大家可以对比一下。

#include <stdio.h>#include <string.h>#define max(a,b)((a)>(b)?(a):(b))int map[110][110];int dp[110][110];int n,m,max1;int dis[4][2]= {0,1,1,0,-1,0,0,-1};int  dfs(int x,int y){    if(dp[x][y]>0)        return dp[x][y];    for(int i=0; i<4; i++)    {        int tx=x+dis[i][0];        int ty=y+dis[i][1];        if(tx>=1&&ty>=1&&tx<=n&&ty<=m&&map[tx][ty]<map[x][y])        {            dp[x][y]=max(dfs(tx,ty)+1,dp[x][y]);        }    }    return dp[x][y];}int main(){    while(~scanf("%d %d",&n,&m))    {        for(int i=1; i<=n; i++)            for(int j=1; j<=m; j++)                scanf("%d",&map[i][j]);        memset(dp,0,sizeof(dp));        for(int i=1; i<=n; i++)        {            for(int j=1; j<=m; j++)            {                dp[i][j]=dfs(i,j);            }        }        int max1=0;        for(int i=1; i<=n; i++)            for(int j=1; j<=m; j++)                max1=max(max1,dp[i][j]);        printf("%d\n",max1+1);    }    return 0;}

       




0 0
原创粉丝点击