zoukankan      html  css  js  c++  java
  • POJ 1088 滑雪【记忆化搜索】

    题意:给出一个二维矩阵,要求从其中的一点出发,并且当前点的值总是比下一点的值大,求最长路径

    记忆化搜索,首先将d数组初始化为0,该点能够到达的路径长度保存在d数组中,同时把因为路径是非负的,所以如果已经计算过某个点,那么这个点的d一定是正的,所以每次搜的时候判断一下d[i][j],如果是正的,就不用再计算了。

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstring> 
     4 #include <cmath>   
     5 #include<algorithm>  
     6 using namespace std;
     7 
     8 typedef long long LL;
     9 int a[105][105],d[105][105],n,m;
    10 int dir[4][2]={1,0,-1,0,0,1,0,-1};
    11 
    12 int dfs(int x,int y){
    13     if(d[x][y]) return d[x][y];//如果已经搜过这一点,则直接返回,不用再重复计算 
    14     int ans=0;
    15     for(int i=0;i<4;i++){ //四个 方向搜 
    16         int nx=x+dir[i][0];
    17         int ny=y+dir[i][1];
    18         if(nx<1||nx>n||ny<1||ny>m) continue;//越界 
    19         if(a[x][y]>a[nx][ny])
    20         ans=max(ans,1+dfs(nx,ny));
    21     }
    22     
    23     if(ans==0) return d[x][y]=1;
    24     return d[x][y]=ans;    
    25 }
    26 
    27 int main()
    28 {
    29     while(scanf("%d %d",&n,&m)!=EOF){
    30         for(int i=1;i<=n;i++)
    31         for(int j=1;j<=m;j++) cin>>a[i][j];
    32         
    33         memset(d,0,sizeof(d));
    34         int tmp=0;
    35                 
    36         for(int i=1;i<=n;i++){
    37             for(int j=1;j<=m;j++)
    38              tmp=max(tmp,dfs(i,j));
    39         }
    40         printf("%d
    ",tmp);
    41     }
    42     return 0;
    43 }
    View Code
  • 相关阅读:
    ZOJ 3705 Applications
    UVA 220 Othello
    HDU 2084 数塔
    第五章:变量
    第四章:注释
    第三章:程序结构
    第二章:项目的创建和环境熟悉
    第一章:c#开发环境安装
    处理字段串
    查询表的列信息
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4321660.html
Copyright © 2011-2022 走看看