单调栈 二 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");

}

你可能感兴趣的:(OJ)