3 条题解

  • 0
    @ 2025-7-4 18:58:41
    #include<bits/stdc++.h>
    #define f(i,l,r) for(int i=l;i<=r;i++)
    #define F(i,r,l) for(int i=r;i>=l;i--)
    using namespace std;
    int n,m,a[2505][2505],s,b[2505][2505],ans,ma;
    void dfs1(int x,int y);//向左下方搜索
    void dfs2(int x,int y);//向右下方搜索
    int r(){
    	int x=0;
    	char ch=getchar();
    	while(ch<'0'||ch>'9') ch=getchar();
    	while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
    	return x;
    }
    int main(){
    	n=r();m=r();
    	f(i,1,n){
    		int sum=0;
    		f(j,1,m){
    			a[i][j]=r();
    			sum+=a[i][j];
    			b[i][j]=b[i-1][j]+sum;
    		}
    	}
    	f(i,1,n)f(j,1,m){
    		if(a[i][j]){
    			ans=0;
    			dfs1(i,j);
    			ma=max(ma,ans);
    			ans=0;
    			dfs2(i,j);
    			ma=max(ma,ans);
    		}
    	}
    	cout<<ma;
    	return 0;
    }
    void dfs1(int x,int y){
    	if(x<1||x>n||y<1||y>m||b[x][y+ans]-b[x][y-1]-b[x-ans-1][y+ans]+b[x-ans-1][y-1]!=ans+1||!a[x][y]) return;
    	//c[x][y]=1;
    	ans++;dfs1(x+1,y-1);
    	return;
    }
    void dfs2(int x,int y){
    	if(x<1||x>n||y<1||y>m||b[x][y]-b[x-ans-1][y]-b[x][y-ans-1]+b[x-ans-1][y-ans-1]!=ans+1||!a[x][y]) return;
    	//c[x][y]=1;
    	ans++;dfs2(x+1,y+1);
    	return;
    }
    /*
    题意:
    把大池子视为 01 矩阵(
    0 表示对应位置无鱼,1 表示对应位置有鱼)
    在代表池子的 01 矩阵中,有很多的正方形子矩阵,
    如果某个正方形子矩阵的某条对角 线上都有鱼,
    且此正方形子矩阵的其他地方无鱼,
    猫猫就可以从这个正方形子矩阵
    “对角线 的一端”下口,
    只一吸,就能把对角线上的那一队鲜鱼吸入口中。 猫
    猫是个贪婪的家伙,所以她想一口吃掉尽量多的鱼。
    求最多可以吃掉多少条鱼?
    
    dfs找到最长对角线(1)即可
    */
    
    • 0
      @ 2022-11-19 22:51:53
      一个类似于搜索 + 二维前缀和的东西???
      
      #include<bits/stdc++.h>
      using namespace std;
      int m,n,i,j,a[2505][2505],ma,qz[2505][2505],dx,dy;
      namespace IO{
      	char ibuf[(1<<20)+1],*iS,*iT;
      	#if ONLINE_JUDGE
      	#define gh() (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),(iS==iT?EOF:*iS++):*iS++)
       	#else
      	#define gh() getchar()
      	#endif
      	#define reg register
      	inline long long read(){
      		reg char ch=gh();
      		reg long long x=0;
      		reg char t=0;
      		while(ch<'0'||ch>'9')   t|=ch=='-',ch=gh();
      		while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();
      		return t?-x:x;
      	}
      }
      using IO::read;//快读
      void write(int x) {//快输
      	if(x<0){
      		putchar('-');
      		write(-x);
      		return;
      	}
      	if(x>=10)write(x/10);
      	putchar(x%10+'0');
      	//if(x<10)puts("");
      }
      int dfs1(int x,int y)//从左上到右下
      {
         if(x<1||y<1||x>n||y>m||!a[x][y]||(qz[x][y]+qz[dx-1][dy-1]-qz[dx-1][y]-qz[x][dy-1])!=x-dx+1)return 0;//边界及判断是否全为鱼
         int l=dfs1(x+1,y+1)+1;
         ma=max(ma,l);//找最大
         return l;
      }
      int dfs2(int x,int y)//与上面类同
      {
         if(x<1||y<1||x>n||y>m||!a[x][y]||(qz[x][dy]+qz[dx-1][y-1]-qz[dx-1][dy]-qz[x][y-1])!=x-dx+1)return 0;//求鱼的个数与上面有所不同
         int l=dfs2(x+1,y-1)+1;
         ma=max(ma,l);
         return l;
      }
      int main()
      {
         n=read();m=read();
         for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            {
               a[i][j]=read();
               qz[i][j]=qz[i-1][j]+qz[i][j-1]-qz[i-1][j-1]+a[i][j]; //二维前缀和
            }
         for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
               if(a[i][j]){
                  dx=i,dy=j;
                  dfs1(i,j);
               }
         for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
               if(a[i][j]){
                  dx=i,dy=j;//记录当前坐标
                  dfs2(i,j);
               }
         write(ma);//输出
         return 0;
      }
      • -1
        @ 2024-11-30 16:24:16

        dp(主要代码):

        if(a[i][j]){
        				int l=dp[i-1][j-1][0]+1,r=dp[i-1][j+1][1]+1,k;
        				for(k=1;k<=dp[i-1][j-1][0];k++)
        					if(a[i-k][j]||a[i][j-k]){
        						l=k;
        						break;
        					}
        				for(k=1;k<=dp[i-1][j+1][1];k++)
        					if(a[i-k][j]||a[i][j+k]){
        						r=k;
        						break;
        					}
        				dp[i][j][0]=l,dp[i][j][1]=r,ans=max(max(dp[i][j][0],dp[i][j][1]),ans);
        			}
        }
        

        tip:因为此题输入数据较大,建议在输入时用scanf或取消同步也可以加快读快输

        • 1

        信息

        ID
        212
        时间
        1000ms
        内存
        256MiB
        难度
        7
        标签
        (无)
        递交数
        223
        已通过
        48
        上传者