• POJ 1088 滑雪


    给出一个R×C的地图,以及每个点的海拔,问下降序列最长多大?

    简单的DP,记忆化搜索;

    dp(i, j)

    if f[i, j]已经计算过

      return f[i, j];

    f[i, j] = 1;

    for i = 1:k

      (ni, nj) = (i, j) + d[k];

      if  (ni, nj)合法 && h[i, j] > h[ni, nj]

        then f[i, j] = dp[ni, nj] + 1;

    return f[i, j];

    /* 滑雪:简单dp */
    
    # include <stdio.h>
    # include <string.h>
    
    # define IN(x,low,high) ((x)>=(low) && (x)<=(high))
    
    # define MAXN 101
    
    const short int d[4][2] = {{-1,0}, {0, 1}, {1, 0}, {0, -1}};
    short int R, C;
    short int h[MAXN][MAXN], f[MAXN][MAXN];
    
    int dp(int i, int j)
    {
        int k, ni, nj;
        
        if (f[i][j] > 0) return f[i][j];
        f[i][j] = 1;
        for (k = 0; k < 4; ++k)
        {
            ni = i + d[k][0];
            nj = j + d[k][1];
            if (IN(ni, 1, R) && IN(nj, 1, C) && h[i][j] > h[ni][nj] && f[i][j] < dp(ni, nj)+1)
                f[i][j] = f[ni][nj] + 1;
        }
        
        return f[i][j];
    }
    
    int main()
    {
        int i, j, ans;
        
        while (~scanf("%d%d", &R, &C))
        {
            for (i = 1; i <= R; ++i)
            for (j = 1; j <= C; ++j)
                scanf("%d", &h[i][j]);
            
            ans = 0;        
            memset(f, -1, sizeof(f));
            for (i = 1; i <= R; ++i)
            for (j = 1; j <= C; ++j)
                if (ans < dp(i,j)) ans = f[i][j];
            
            printf("%d\n", ans);
        }
        
        return 0;
    }
  • 相关阅读:
    mysql生成百万级数量测试数据
    记2017深圳寻找工作
    好朋友的小姨,希望一起帮助下度过难关,方便的话请帮忙转发一下,谢谢。————————心情记录
    shell变量
    什么是Shell
    Windows环境下的安装gcc
    make
    gdb
    gcc
    数据库编程
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2452920.html
Copyright © 2020-2023  润新知