杭电1506 java

求最大子矩阵面积(dp)

import java.util.*;
public class Main1{
  
    public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
 
          int n = sc.nextInt();
          int a[]= new int [2*n+1];
 
          for(int i=1;i<=n;i++){
              a[i]=sc.nextInt();
          }
         int l[]=new int[10010];
         int r[]=new int[10010];
         l[1]=1; r[n]=n;
         for(int i=2;i<=n;i++){
            int  t = i;              //记录a[i]往左比他小的最小边界
             while(t>1&&a[i]<=a[t-1])
                t= l[t-1];              //这步相当巧妙,直接实现了跳转,如果a[t-1]不小于a[i]的话,我们可以断定a[t-1]的最左边肯定包含a[i]的最左边.直接跳过中间的点
l[i]=t; } for(int i=n-1;i>=1;i--){ int t = i; while(t<n&&a[i]<=a[t+1]) t= r[t+1]; r[i]=t; } int ans=0; // System.out.println("fd"); for(int i=1;i<=n;i++){ // System.out.println("dff"); ans=Math.max(ans,(r[i]-l[i]+1)*a[i]); } System.out.println(ans); } } // }

猜你喜欢

转载自www.cnblogs.com/ls-pankong/p/10502141.html
今日推荐