• poj 1088 (dfs+记忆化) 滑雪


    题目;http://poj.org/problem?id=1088

    感觉对深搜还不太熟练,所以练习一下,类似于连连看的那题,注意的是所求的是最大达长度,并不是从最大的或者最小的点出发得到的就是最长的路径

     1 #include<iostream>
     2 using namespace std;
     3 int dx[]={0,0,1,-1};
     4 int dy[]={1,-1,0,0};
     5 int n,m,dis[105][105];
     6 int vis[105][105];
     7 void dfs(int x,int y)
     8 {
     9     for (int i=0;i<4;i++)
    10     {
    11         int sx=x+dx[i];
    12         int sy=y+dy[i];
    13         if (sx<1||sx>n||sy<1||sy>m) continue;
    14         if (dis[sx][sy]<=dis[x][y]) continue;
    15         if (vis[sx][sy]>=vis[x][y]+1) continue;
    16         vis[sx][sy]=vis[x][y]+1;
    17         dfs(sx,sy);
    18     }
    19 }
    20 int main()
    21 {
    22     int i,j;
    23     cin>>n>>m;
    24     for (i=1;i<=n;i++){
    25         for(j=1;j<=m;j++){
    26             cin>>dis[i][j];
    27             vis[i][j]=1;
    28         }
    29     }
    30     for (i=1;i<=n;i++)
    31        for (j=1;j<=m;j++)
    32          dfs(i,j);
    33     int mx=0;
    34     for (i=1;i<=n;i++)
    35        for (j=1;j<=m;j++)
    36            if (mx<vis[i][j]) mx=vis[i][j];
    37     cout<<mx<<endl;
    38     return 0;
    39 }

    差不多

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int dx[5]={1,-1,0,0};
     5 int dy[5]={0,0,-1,1};
     6 int n,m,vis[101][101];
     7 int hei[101][101];
     8 int dfs(int x,int y)
     9 {
    10     if (vis[x][y]) return vis[x][y];
    11     int ans=0;
    12     for (int i=0;i<4;i++)
    13     {
    14         int sx=x+dx[i];
    15         int sy=y+dy[i];
    16         if (sx<1||sx>n||sy<1||sy>m) continue;
    17         if (hei[sx][sy]>=hei[x][y]) continue;
    18         vis[sx][sy]=dfs(sx,sy);
    19         if (ans<vis[sx][sy])
    20             ans=vis[sx][sy];
    21     }
    22     if (ans) return ans+1;
    23     return 1;
    24 }
    25 int main()
    26 {
    27     int i,j,x,y;
    28     scanf("%d %d",&n,&m);
    29     int mn=100005;
    30     for (i=1;i<=n;i++)
    31     {
    32         for (j=1;j<=m;j++)
    33         {
    34             scanf("%d",&hei[i][j]);
    35             if (hei[i][j]<mn)
    36             {
    37                 x=i,y=j;
    38                 mn=hei[i][j];
    39             }
    40         }
    41     }
    42     memset(vis,0,sizeof(vis));
    43     vis[x][y]=1;
    44     for (i=1;i<=n;i++)
    45         for (j=1;j<=m;j++)
    46             vis[i][j]=dfs(i,j);
    47     int mx=0;
    48     for (i=1;i<=n;i++)
    49         for (j=1;j<=m;j++)
    50            if (mx<vis[i][j]) mx=vis[i][j];
    51     printf("%d
    ",mx);
    52     return 0;
    53 }
  • 相关阅读:
    dbutils关于连接维护的问题Q
    触发器
    mysql的full join的实现
    mysql exists 和 in的效率比较
    浏览器禁用Cookie后的session处理
    自定义org.apache.commons.beanutils的类型转换器
    Java中形参个数可变的方法
    递归方法的重要规定——递归一定要向己知方向递归
    抽象工厂模式——肯德基消费
    异常链
  • 原文地址:https://www.cnblogs.com/JJCHEHEDA/p/4859468.html
Copyright © 2020-2023  润新知