求最大子矩陣面積其實就是求每個數左邊>=a[i]的下標,右邊>=a[i]的下標,然後就會求出面積了!
#include <list>#include <map>#include <set>#include <queue>#include <string>#include <deque>#include <stack>#include <algorithm>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>#include <time.h>#include <string.h>using namespace std;#define LL long long#define PI acos(-1.0)#define Max INT_MAX#define Min INT_MIN#define eps 1e-8#define FRE freopen("a.txt","r",stdin)#define N 100010LL max(LL a,LL b){return a>b?a:b;}LL h[N];int l[N],r[N];int main(){ int n; while(scanf("%d",&n) &&n){ int i,j; for(i=1;i<=n;i++){ scanf("%I64d",&h[i]); l[i]=r[i]=i; //初始化為i } h[0]=h[n+1]=-1; //防止死迴圈! for(i=1;i<=n;++i) //1~n while(h[l[i]-1] >= h[i]) l[i] = l[l[i]-1]; for(i=n;i>=1;--i) //n~1 while( h[r[i]+1] >= h[i]) r[i] = r[r[i]+1]; LL ans=0; for(i=1;i<=n;i++){ ans=max(ans , (r[i]-l[i]+1)*h[i]); } printf("%I64d\n",ans); } return 0;}