• poj 1088 滑雪 DP(dfs的记忆化搜索)


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

     

    题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径

     

    分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关)。记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离。

    dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+1,dp[x][y-1]+1,dp[x-1][y]+1,dp[x][y+1]+1);

     1 #include<cstdio>
     2 #include<queue>
     3 #include<algorithm>
     4 //dp[x][y]表示 (x,y)这个点的最长下滑路径
     5 using namespace std;
     6 const int maxn = 102;
     7 using namespace std;
     8 int n, m,bx,by,ans;
     9 int G[maxn][maxn];
    10 int dp[maxn][maxn];
    11 int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//这种图的搜索 可以把方向写在一个数组中 使代码更简洁
    12 int dfs(int x, int y)
    13 {
    14     if(dp[x][y])//如果之前已经有结果 那么直接使用
    15     {
    16         return dp[x][y];
    17     }
    18     for(int i = 0; i < 4;i++)
    19     {
    20         int tx = x,ty = y;
    21         tx += dir[i][0];
    22         ty += dir[i][1];
    23 //        下面2个if都是排除非法情况
    24         if(tx < 0 || tx >= n || ty < 0 || ty >= m) continue;
    25         if(G[tx][ty] >= G[x][y]) continue;
    26 //        如果四周的点都比自己高 或者路径长没自己长 那么不更新 否则更新为四周的点+1
    27         dp[x][y] = max(dp[x][y],dfs(tx,ty)+1);
    28     }
    29     return dp[x][y];
    30 
    31 }
    32 int main()
    33 {
    34 
    35     scanf("%d %d", &n,&m);
    36     for(int i = 0;i < n; i++)
    37     {
    38         for(int j = 0; j < m; j++)
    39         {
    40             scanf("%d", &G[i][j]);
    41 
    42         }
    43     }
    44     ans = 0;
    45     for(int i =0; i < n; i++)
    46     {
    47         for(int j = 0; j < m; j++)
    48         dfs(i,j);
    49     }
    50     for(int i =0; i < n; i++)
    51     {
    52         for(int j = 0; j < m; j++)
    53          ans = max(ans,dp[i][j]);
    54     }
    55     printf("%d",ans+1);//因为自己也算做一步 所以ans+1
    56 
    57     return 0;
    58 }
  • 相关阅读:
    [导入]google的网络U盘
    [导入]下载 Visual Studio 2005 Starter Kits,提高效率!
    TXT文件 是 好多列 组成,其中有一列是 身份证,如何 用EXCEL 打开时,不会变成 科学计数的形式?
    个人所得税2011新计算公式Excel版,及由税款倒推收入额
    ServU虚拟路径映射问题
    Access .mdb数据库 转成 SQLITE数据库
    undefined与null的区别
    从内存的角度来区分基本类型和引用类型的区别
    JAVA类加载和反射介绍
    onConfigurationChanged的作用
  • 原文地址:https://www.cnblogs.com/Jadon97/p/6793369.html
Copyright © 2020-2023  润新知