pku1088 滑雪

#include <stdio.h>

#define maxsize 100
#define inf 10001

int hill[maxsize+2][maxsize+2];
int vis[maxsize+2][maxsize+2];
const int dis[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

int DFS(int x,int y)
{
    int i;
    for(i=0; i<4; i++){
        if(hill[x][y]>hill[x+dis[i][0]][y+dis[i][1]]&&vis[x][y]+1>vis[x+dis[i][0]][y+dis[i][1]]){
                vis[x+dis[i][0]][y+dis[i][1]]=vis[x][y]+1;
                DFS(x+dis[i][0],y+dis[i][1]);
        }    
    }    
    return 0;
}    

int main()
{
    int m,n;
    int i,j,max;
    int x,y;
    
    scanf("%d %d",&m,&n);

    for(i=0; i<=m+1; i++) hill[i][0]=hill[i][n+1]=inf;
    for(i=0; i<=n+1; i++) hill[0][i]=hill[m+1][i]=inf;
    
    for(i=1; i<=m; i++){
        for(j=1; j<=n; j++){
            scanf("%d",&hill[i][j]);
            vis[i][j]=0;  
  }
 }  
    
    while(1){
        max=-1;
        for(i=1; i<=m; i++)
            for(j=1; j<=n; j++)
          if(vis[i][j]==0&&hill[i][j]>max){ max=hill[i][j]; x=i; y=j; }
    if(max==-1) break;
     vis[x][y]=1;
    DFS(x,y);
 }
 for(i=1; i<=m; i++)
  for(j=1; j<=n; j++){
      if(max<vis[i][j]) max=vis[i][j];
  }
    printf("%d",max);
    return 0;
}

解体报告:

在最长路径的情况下,Ai->Ai-1->----->A1,它的子结构Ai-1->----->A0,也是最优的。
所以搜索中如果遇到已经路过的节点,看是否路程长度增大。若是,则该路径有可能成为解,
否则直接排出可能性。所以只要保证,每个节点都经历过,便能求得解。
因为不用求路径,所以每个点只用一个数字就可以记录改点是否经过,和该点的最长路程。
每次DFS前找到点最高且没有经过的节点开始搜索。最后找到记录里最大的值,便是解。

转载于:https://www.cnblogs.com/ITEagle/archive/2009/12/23/1630999.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值