杭电1506 java

时间:2023-02-01 23:23:25

求最大子矩阵面积(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); } } // }