算法地址:http://www.csie.ntnu.edu.tw/~u91029/MaximumSubarray.html#2
题目连接:https://vjudge.net/contest/170761#problem/B
代码:
#include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <queue> #include <stack> #include <map> using namespace std; const int maxn=200+20; int arr[maxn][maxn]; int wl[maxn];//向左能延长的最长长度 int wr[maxn];//向右能延长的最长长度 int h[maxn];//能延长的最高高度 int l[maxn];//向上到边界,能向左延长的最大长度 int r[maxn];//向上到边界,能向右延长的最大长度 int main() { int T; scanf("%d",&T); while(T--) { int n,m; memset(wl,0,sizeof(wl)); memset(h,0,sizeof(h)); memset(wr,0,sizeof(wr)); memset(r,0,sizeof(r)); memset(l,0,sizeof(l)); scanf("%d %d",&n,&m); for(int i=0;i<=n+1;i++) arr[i][0]=0; for(int i=0;i<=n+1;i++) arr[0][i]=0; for(int i=0;i<=n+1;i++) arr[n+1][i]=0; for(int i=0;i<=n+1;i++) arr[i][n+1]=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) arr[i][j]=1; } for(int i=1;i<=m;i++) { int r1,l1,r2,l2; scanf("%d %d %d %d",&r1,&l1,&r2,&l2); for(int i=r1;i<=r2;i++) { for(int j=l1;j<=l2;j++) { arr[i][j]=0; } } } /*for(int i=0;i<=n+1;i++) { for(int j=0;j<=n+1;j++) { cout<<arr[i][j]<<" "; } cout<<endl; }*/ int mx=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(arr[i][j]) wl[j]=wl[j-1]+1; else wl[j]=0; } for(int j=n;j>=1;j--) { if(arr[i][j]) wr[j]=wr[j+1]+1; else wr[j]=0; } for(int j=1;j<=n;j++) { if(arr[i][j]) h[j]=h[j]+1; else h[j]=0; } for(int j=1;j<=n;j++) { if(r[j]==0) r[j]=wr[j]; else r[j]=min(r[j],wr[j]); } for(int j=1;j<=n;j++) { if(l[j]==0) l[j]=wl[j]; else l[j]=min(l[j],wl[j]); } for(int j=1;j<=n;j++) { mx=max(mx,(r[j]+l[j]-1)*h[j]); } } cout<<mx<<endl; } return 0; }