zoukankan      html  css  js  c++  java
  • 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前找到点最高且没有经过的节点开始搜索。最后找到记录里最大的值,便是解。
  • 相关阅读:
    20155215 第二周测试1 与 myod
    2017-2018-1 20155215 《信息安全系统设计基础》第1周学习总结
    第十四周 P187教材检查
    数据库1 实验代码和截图补交
    20155215 2016-2017-2《Java程序设计》课程总结
    20155215 宣言 实验五 网络编程与安全 实验报告
    实验MyOD
    Alpha冲刺——代码规范与计划
    您为何会咸鱼———项目系统设计与数据库设计
    您为何会咸鱼——团队 Gitee 实战训练
  • 原文地址:https://www.cnblogs.com/ITEagle/p/1630999.html
Copyright © 2011-2022 走看看