zoukankan      html  css  js  c++  java
  • uva 10285 Longest Run on a Snowboard

    复习一下基础DP,记忆化搜索

    题意:给一个名字,和n*m矩阵,下面是矩阵信息,每次在一个格子,可以向上下左右移动,但是要求那个数字比当前所在格子数字小。可以从任意点出发,问最长的距离是多少

    dp[i][j]表示从(i,j)出发能走的最长路

    dp[i][j] = max{ dp[x][y] } + 1 , 其中(x,y)是(i,j)附近的四个格子之一并且a[x][y] < a[i][j]

    #include <cstdio>
    #include <cstring>
    #define N 110
    #define MAX 110
    #define max(a,b) ((a)>(b)?(a):(b))
    
    const int x[4]={-1,1,0,0}; //上下左右
    const int y[4]={0,0,-1,1}; //上下左右
    int a[N][N];
    int dp[N][N];
    int n,m;
    
    int dfs(int i, int j)
    {
       if(dp[i][j] != -1)
          return dp[i][j];
    
       dp[i][j] = 0;
       for(int k=0; k<4; k++) //4个方向
       {
          int xx = i + x[k];
          int yy = j + y[k];
          if(a[xx][yy] < a[i][j])
             dp[i][j] = max(dp[i][j] , dfs(xx,yy));
       }
       return ++dp[i][j];
    }
    
    int main()
    {
       int cas;
       scanf("%d",&cas);
       while(cas--)
       {
          char name[50];
          scanf("%s%d%d",name,&n,&m);
          for(int i=1; i<=n; i++)
             for(int j=1; j<=m; j++)
                scanf("%d",&a[i][j]);
          for(int i=0; i<=m+1; i++)
             a[0][i] = a[n+1][i] = MAX;
          for(int i=0; i<=n+1; i++)
             a[i][0] = a[i][m+1] = MAX;
    
          memset(dp,-1,sizeof(dp));
          int res = -1;
          for(int i=1; i<=n; i++)
             for(int j=1; j<=m; j++)
                res = max(res , dfs(i,j));
    
          printf("%s: %d\n",name,res);
       }
       return 0;
    }
  • 相关阅读:
    台湾大学李宏毅机器学习教程
    自编码器AE & 变分自编码器VAE
    深度信念网络(DBN)和堆叠自编码(SAE)、深度自编码器(DAE)的区别
    花式自动编码器
    迁移和域自适应
    MMD :maximum mean discrepancy
    数据可视化工具t-SNE
    线性判别分析(LDA)
    弱监督学习
    如何生成不重复的随机数
  • 原文地址:https://www.cnblogs.com/scau20110726/p/3036373.html
Copyright © 2011-2022 走看看