背景 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; }
继续