zoukankan      html  css  js  c++  java
  • 矩阵单调栈用法--简单应用

    题目 Largest Rectangle in a Histogram
    在这里插入图片描述
    单调栈此时退栈,知道可以加进去图中最后一个小的,但是此时也就相当于在实际面积中算了一个红色区域,【因为要边算面积,边退栈】 , 然后就是新入栈的宽应该是红色的宽度,也就是退栈时记录的width + 1

    #include <iostream>
    #include <stack>
    #include <cstdio>
    using namespace std;
    const int N = 1e5+ 10 ;
    typedef long long ll ;
    int a[N] ;
    stack<pair<int , int> > p ;
    int main()
    {
    	int n ;
    	while(cin >> n && n)
    	{
    		for(int i = 1;i <= n;i ++) scanf("%d",&a[i]) ;
    		a[n + 1] = 0 ;
    		while(p.size()) p.pop() ;
    	    p.push(make_pair(0 , 0)) ;
    	    ll width  ;ll maxn = 0 ;
    	    for(int i = 1;i <= n + 1;i ++)
    	     {
    	     	width = 0 ;
    	     	if(a[i] > a[p.top().first]) p.push(make_pair(i , 1));
    	     	else 
    	     	{
    	     		while(a[p.top().first] > a[i])
    	     	 {
    	     	 	width += p.top().second  ;
    	     	 	maxn = maxn > 1ll * width * a[p.top().first] ? maxn : 1ll * width * a[p.top().first] ;
    	     	 	p.pop() ;
    			 }
    			 p.push(make_pair(i , width + 1)) ;
    			 }
     	     	
    		 }
    		 cout << maxn  << endl ;
    	}
    	return 0 ;
     } 
    
    每次做题提醒自己:题目到底有没有读懂,有没有分析彻底、算法够不够贪心、暴力够不够优雅。
  • 相关阅读:
    枚举类型的应用
    动手动脑
    四则运算和验证码--源码
    ATM源码
    javabean+jsp+servlet+jdbc
    四则运算改良
    Java异常
    课后总结
    包装类Integre
    对象验证
  • 原文地址:https://www.cnblogs.com/spnooyseed/p/12870924.html
Copyright © 2011-2022 走看看