地表最强男人 @ 2019-04-09 12:03:10
using namespace std; int n,m,s[2600][2600],a[2600][2600],f[2600][2600],g[2600][2600];//s为前缀和 int main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[i][j]; s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { f[i][j]=max(f[i][j],f[i-1][j]); f[i][j]=max(f[i][j-1],f[i][j]); if(a[i][j]==1) { f[i][j]=max(f[i][j],1); if(a[i-1][j-1]==1&&f[i-1][j-1]+1==s[i][j]-s[i-f[i-1][j-1]-1][j]-s[i][j-f[i-1][j-1]-1]+s[i-f[i-1][j-1]-1][j-f[i-1][j-1]-1]) f[i][j]=max(f[i][j],f[i-1][j-1]+1); } } } for(int i=1;i<=n;i++) { for(int j=m;j>=1;j--) { g[i][j]=max(g[i][j],g[i-1][j]); g[i][j]=max(g[i][j+1],g[i][j]); if(a[i][j]==1) { g[i][j]=max(g[i][j],1); if(a[i-1][j+1]==1&&g[i-1][j+1]+1==s[i][j+g[i-1][j+1]]-s[i-g[i-1][j+1]-1][j+g[i-1][j+1]]-s[i][j-1]+s[i-g[i-1][j+1]-1][j-1]) g[i][j]=max(g[i][j],g[i-1][j+1]+1); } } } cout<<max(f[n][m],g[n][1]); return 0; }
by 地表最强男人 @ 2019-04-09 12:03:28
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,s[2600][2600],a[2600][2600],f[2600][2600],g[2600][2600];//s为前缀和
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=max(f[i][j],f[i-1][j]);
f[i][j]=max(f[i][j-1],f[i][j]);
if(a[i][j]==1)
{
f[i][j]=max(f[i][j],1);
if(a[i-1][j-1]==1&&f[i-1][j-1]+1==s[i][j]-s[i-f[i-1][j-1]-1][j]-s[i][j-f[i-1][j-1]-1]+s[i-f[i-1][j-1]-1][j-f[i-1][j-1]-1])
f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=m;j>=1;j--)
{
g[i][j]=max(g[i][j],g[i-1][j]);
g[i][j]=max(g[i][j+1],g[i][j]);
if(a[i][j]==1)
{
g[i][j]=max(g[i][j],1);
if(a[i-1][j+1]==1&&g[i-1][j+1]+1==s[i][j+g[i-1][j+1]]-s[i-g[i-1][j+1]-1][j+g[i-1][j+1]]-s[i][j-1]+s[i-g[i-1][j+1]-1][j-1])
g[i][j]=max(g[i][j],g[i-1][j+1]+1);
}
}
}
cout<<max(f[n][m],g[n][1]);
return 0;
}
by 地表最强男人 @ 2019-05-01 17:03:43
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,s[2600][2600],a[2600][2600];//s为前缀和
int f[2600][2600],g[2600][2600],ans=0;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]==1)
{
f[i][j]=1;
if(a[i-1][j-1]==1&&f[i-1][j-1]+1==s[i][j]-s[i-f[i-1][j-1]-1][j]-s[i][j-f[i-1][j-1]-1]+s[i-f[i-1][j-1]-1][j-f[i-1][j-1]-1])
f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=m;j>=1;j--)
{
if(a[i][j]==1)
{
g[i][j]=1;
if(a[i-1][j+1]==1&&g[i-1][j+1]+1==s[i][j+g[i-1][j+1]]-s[i-g[i-1][j+1]-1][j+g[i-1][j+1]]-s[i][j-1]+s[i-g[i-1][j+1]-1][j-1])
g[i][j]=max(g[i][j],g[i-1][j+1]+1);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
ans=max(ans,f[i][j]);
ans=max(ans,g[i][j]);
}
}
cout<<ans;
return 0;
}
by qwe000000 @ 2019-08-13 23:27:26
点我