効果の件名:
プッシュ順序の1-N N総数を与え、スタックは常に辞書最大スタックを得ることができます。
入力例 | 出力例 |
5 1 2 3 4 5 |
5 4 3 2 1 |
5 4 2 5 3 1 |
5 3 2 4 1 |
トピック分析:
xはその後続の図は、AIを表示さより大きい場合、xのスタックの現在のトップを想定し、aiは定数辞書大きなスタックのスタックです。したがって、その後、スタックのシミュレーション、スタックが空になるまでスタックをポップされたまたは上部要素サフィックスの最大値未満であることができます。
両方の各番号の後に最大値のブルートフォース検索を行う場合、時間計算量はO(N ^ 2)です。したがって、それは暴力的な検索、最適化する必要がありません。
動的計画法の導入をここに。我々アレイは、iが1 + DP [I]で最後のアイテム、及びI + 1 I +アイテムの最大値の最大値は、2つの最大値を開始するために開始し、[i]は最大値をとります、遷移方程式DPを確立することが可能である[I] = MAX(DP [I + 1]、[I]);再び、O(n)を最大サフィックスを前処理掃引を開始することができ最後までから第プレスシミュレーションをすることができます。
ACは、次のコードを貼り付けます。
#include <ビット/ STDC ++ H> 使用して名前空間STDを、const int型 MAXN = 1E5 + 5 。 スタック < int型 > S; INT [MAXN]、DP [MAXN] int型のmain() { IOS :: sync_with_stdio(偽); cin.tie(0 )。 int型のn; cinを >> N; 以下のために(int型 i = 0 ; iがn <; iは++)CIN >> [I]。 DP [N - 1 ] = 0 。 以下のための(int型 I = N- 2、I> = 0 ; i--)DP [I] = MAX(DP [I + 1 ]、[I + 1 ])。 以下のために(int型 i = 0 ; iがn <I ++の) { s.pushを([I])。 しばらく(!s.empty()&& s.top()> DP [i])と coutの << s.top()<< " " 、s.pop(); } 戻り 0 。 }