背景 Background
描述 Description
输入格式 InputFormat
输出格式 OutputFormat
样例输入 SampleInput [复制数据]
样例输出 SampleOutput [复制数据]
数据范围和注释 Hint
代码
时间及空间复杂度 | 题解 |
时间复杂度:O(n^6) | 方法一:枚举子矩阵的每一个左上角坐标和右下角坐标,在逐个检查枚举的矩阵是否符合单调特性。预期得分30 |
时间复杂度:O(N^3) | 方法二:预处理column[i][j]以及can[i][j][k]数组。 |
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,a[201][201],u[201][201],f[201][201][201],ans;
bool can[201][201][201];
int main()
{
scanf("%d%d",&n,&m);
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++)
if(a[i][j]>=a[i-1][j])u[i][j]=u[i-1][j]+1;
else u[i][j]=1;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
for(int k=1;k<=m;k++){
if((can[i][j-1][k]||j-1<i)&&u[j][k]>=j-i+1&&a[j][k]>=a[j][k-1]&&u[j][k]>=j-i+1)
can[i][j][k]=1;}
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
for(int k=1;k<=m;k++)
{
if(can[i][j][k])f[i][j][k]=f[i][j][k-1]+j-i+1;
else if(u[j][k]>=j-i+1)f[i][j][k]=j-i+1;
ans=max(ans,f[i][j][k]);
}
printf("%d",ans);
return 0;
}
继续