3 条题解
-
0
#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
一个类似于搜索 + 二维前缀和的东西??? #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
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
- 上传者