单调栈 二 nyOj 最大矩形和

主要思想来自

http://blog.csdn.net/wuyanyi/article/details/7243580

题目的连接,头次提交的同学需要注册

http://acm.nyist.net/JudgeOnline/problem.php?pid=258

 

此题多年前出现在江湖之中,微软面试100题有,2014网易有道又冲出江湖,此题是单调栈的使用,想了两天,明白一点。得不断的思考啊

其实还是从最简单的(n2)优化而来。总的思路是:

1。每个矩形只出栈一次,入站一次。

2.出栈的时候表明该矩形不能往右边扩展了,所以可以出栈,同时在该矩形入站的时候我们已经计算了它右边的扩展的寛。

总而言之:入站记录了向右扩展

           出栈记录了向左扩展

 

这个思路比较好理解,但是提交之后效率,确实低,但是很容易扩展到不同的,其实数组不用定义,直接输入就行,浪费了,其次是了long long 改为 int型,知识点有漏洞,就是计算机的不骂表示应该掌握,还有就是 Int float表示范围等,高精度,大数据值得联系。

#include<iostream>
#include<stack>
using namespace std;

struct node
{
    long long h;
    long long w;

}n[100006];
int main()
{
    int len;
    while(cin>>len&&len)
    {
        long long  max=-1;//所求的答案
        for(int i=0;i<len;i++)
        {
            cin>>n[i].h;
            n[i].w=1;
        }
        stack<node> s;
        
        s.push(n[0]);
        for(int i=1;i<len;i++)
        {
            if(n[i].h>=s.top().h) //如果当前节点的高大于栈顶,则加入
            {

                s.push(n[i]);
            
            }
            else
            {
                long long  sumw=0;
                while(!s.empty()&&s.top().h>=n[i].h)
                {
                
                    node n2=s.top();
                    s.pop();
                    sumw=sumw+n2.w ;
                    long long temp=sumw*n2.h;
                    if(temp>max)
                    {
                        max=temp;
                    }
                    
                    
                
                }

                n[i].w+=sumw;
                s.push(n[i]);
            
            
            
            
            
            }
        
        
        
        
        }
    
    
    long long sumw=0;
     while(!s.empty())
     {
         node n2=s.top();
         s.pop();
         sumw+=n2.w;
         if(sumw*n2.h>max)
         {
             max=sumw*n2.h;
         }
         
     
     
     }
    
     cout<<max<<endl;
    
    
    
    
    
    }

return 0;
system("pause");
}
posted @ 2014-06-23 13:43  hansongjiang8  阅读(338)  评论(0编辑  收藏  举报