zoukankan      html  css  js  c++  java
  • 单调栈 二 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");
    }
  • 相关阅读:
    学习方法与经验总结
    工具综合症?资料收集狂?
    SpringMVC 过滤器Filter使用解析
    Spring 管理Filter和Servlet
    pom.xml配置详解
    开发Java web应用程序的介绍
    java web构建学习(概念基础)
    题目1474:矩阵幂
    题目1473:二进制数
    Python strip()方法
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3803861.html
Copyright © 2011-2022 走看看