zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    mysql删除重复数据
    Spring缓存注解
    Spring事物不回滚
    java.net.MalformedURLException: no protocol: www.baidu.com
    shred:减少删除文件的还原度
    rm命令防止误操作
    软链接:要根据软链接来写路径
    linux与windows文本文件间的转换:针对回车换行
    cat:文本编辑工具
    算术运算;赋值
  • 原文地址:https://www.cnblogs.com/JJCHEHEDA/p/4859468.html
Copyright © 2011-2022 走看看