柔軟かつ実用的なアプリケーションスタック - ヒストグラム最大の矩形領域

ヒストグラム最大の矩形領域

これ、スタックをトリガするために、小さな遭遇した各メモリ素子インデックスは、左折し始め、深さスタックの原則と機能の理解を容易にするためのアプリケーションの質問のスタックで、右端までのカウントのとき、カウント、実現にA。数およびスタックの長さがあり、今増分され、そして最終的にどのように対処運用メカニズムを理解することに留意されたいです。

ヒストグラムは多くの長方形で構成され、与えられたヒストグラムの最大の矩形領域を識別するために頼みました。ヒストグラムが想定長方形1000の数を超えることはできません。

矩形の全て幅は1つの単位として想定されます。ヒストグラムは、矩形7において以下の連続した矩形が最大12の矩形領域から構成されることができるそれぞれの高さ6,2,5,4,5,1,6を示します。

ヒストグラム.JPG

ヒントを達成:この問題を解決するために、スタックを使用することを検討してください。

入力フォーマット:

入力矩形番号ヒストグラムの最初の行。各高さ間隔スペースで入力行の高さのヒストグラムの第二のセット。

出力フォーマット:

その矩形の矩形ができ連続出力最大面積。

サンプル入力:

ここでは、入力のセットを与えられています。例えば:

7
6 2 5 4 5 1 6

出力例:

出力に対応し、ここで考えます。例えば:

12

ACコード

#include<iostream>
#include<cstdio>
#include<stack>
#include<cmath>
using namespace std;
int main()
{
    int maxs=0,i,h[1010],n,t;
    stack <int> s;
    cin>>n;
    for (i=0;i<=n-1;i++)
      scanf("%d",&h[i]);
    i=0;
    while (i<=n-1)
    {
        if (s.empty() or h[s.top()]<=h[i])
          s.push(i++);
        else
        {
            t=s.top();
            s.pop();
            maxs=max(maxs,h[t]*(s.empty() ? i : (i-s.top()-1)));//触发的i和次峰值之间的(峰值左面都是比他高的,不在栈里,已经出栈、处理过,栈里面存的是地址)长度,空就说明都是比他大的
        }
    }
    while (!s.empty())
    {
        t=s.top();
        s.pop();
        maxs=max(maxs,h[t]*(s.empty() ? i : (i-s.top()-1)));
    }   
    cout<<maxs;
    return 0;
}

おすすめ

転載: www.cnblogs.com/IamIron-Man/p/11956822.html