• 八百标兵奔北坡【DP】


    题目大意:

    现在在一张N*M的地图上有K只babingbaboom!!!对于一张地图上的点都有一个h[i][j] 来表示这个地方的高度。现在这些babingbaboom都想要跑到北边的一个山坡上。求出离每一个babingbaboom最近的靠北的山。

    山: 
    山的周围没有比它更高的地方。(四联通) 
    在北边: 
    令一个人的坐标为A(a,b),山的坐标为B(x,y) ,山在人的北边当且仅当dis[A][B]=ax


    思路:

    很明显是一道DP题目。 
    画一下图就可以发现,其实在北边的位置就是一个三角形。 
    f[i][j]i行j列距离北边最近山峰的距离。 
    那么如果这个位置本身就是一个山峰,那么f[i][j]=0
    如果这个位置不是山峰,那么由于是一个三角形,就有

    f[i][j]=min(f[i1][j+1],min(f[i1][j1],f[i1][j]))+1

    采用离线算法,O(1)输出


    代码:

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #define Inf 99999999
    using namespace std;
    
    int n,m,k,x,y,a[2001][2001],f[2001][2001];
    
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        memset(f,127/3,sizeof(f));  //初始化
        for (int i=1;i<=n;i++)
         for (int j=1;j<=m;j++)
          scanf("%d",&a[i][j]);
        for (int i=1;i<=n;i++)
         for (int j=1;j<=m;j++)  //枚举点
          f[i][j]=(a[i][j]<=a[i-1][j]||a[i][j]<=a[i+1][j]||a[i][j]<=a[i][j-1]||a[i][j]<=a[i][j+1])?min(f[i-1][j+1],min(f[i-1][j-1],f[i-1][j]))+1:0;  //若这是一个山峰,则f[i][j]=0,否则为旁边点到山峰的距离+1 
        while (k--)
        {
            scanf("%d%d",&x,&y);
            f[x][y]>Inf?printf("Pool Babingbaboom!\n"):printf("%d\n",f[x][y]);
        }
        return 0;
    }

     

  • 相关阅读:
    架构师最怕程序员知道的10件事
    利用php制作简单的文本式留言板
    Jmeter之查看结果树
    Jmeter之循环控制器
    Jmeter之HTTP常用配置元件(默认、头信息和cookies)
    Jmeter之线程组(Stepping和Ultimate)
    Jmeter之插件安装
    Jmeter之线程组(默认)
    Jmeter之测试计划
    Jmeter之安装和配置
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9353180.html
Copyright © 2020-2023  润新知