zoukankan      html  css  js  c++  java
  • P4771 八百标兵奔北坡

    观察题目中关于北边的定义,发现是以当前点为顶点,向上的倒三角(自己想想为什么)。

    然后就可以直接 DP 了,令 (f_{i,j}) 表示点 ((i,j)) 的答案。

    [f_{i,j}=min{f_{i-1,j-1},f_{i-1,j},f_{i-1,j+1}} ]

    主要考的是对定义的分析,时间复杂度 (O(NM+K))

    code:

    #include<bits/stdc++.h>
    using namespace std;
    #define N 1005
    #define Min(x,y)((x)<(y)?x:y)
    #define For(i,x,y)for(i=x;i<=(y);i++)
    int h[N][N],f[N][N];
    int read()
    {
    	int A;
    	bool K;
    	char C;
    	C=A=K=0;
    	while(C<'0'||C>'9')K|=C=='-',C=getchar();
    	while(C>'/'&&C<':')A=(A<<3)+(A<<1)+(C^48),C=getchar();
    	return(K?-A:A);
    }
    int main()
    {
    	int n,m,k,i,j,x,y;
    	n=read(),m=read(),k=read();
    	For(j,0,m+1)f[0][j]=INT_MAX>>1;
    	For(i,1,n)
    	For(j,1,m)h[i][j]=read();
    	For(i,1,n)
    	{
    		f[i][0]=f[i][m+1]=INT_MAX>>1;
    		For(j,1,m)f[i][j]=(h[i][j]>=h[i][j-1]&&h[i][j]>=h[i-1][j]&&h[i][j]>=h[i][j+1]&&h[i][j]>=h[i+1][j]?0:Min(f[i-1][j],Min(f[i-1][j-1],f[i-1][j+1]))+1);
    	}
    	while(k--)
    	{
    		x=read(),y=read();
    		if(f[x][y]<INT_MAX>>1)printf("%d
    ",f[x][y]);
    		else puts("Pool Babingbaboom!");
    	}
    	return 0;
    }
    
  • 相关阅读:
    数据库注意事项
    SQL函数
    2019 SDN阅读作业(2)
    2019 SDN上机第五次作业
    2019 SDN上机第四次作业
    2019 SDN阅读作业
    2019 SDN上机第三次作业
    mysql使用记录
    2019 SDN上机第二次作业
    2019 SDN上机第一次作业
  • 原文地址:https://www.cnblogs.com/May-2nd/p/13892739.html
Copyright © 2011-2022 走看看