2017-04-05 14 views
1

問題がどのように最適なサブ構造を持っているかを理解するために多くのオンラインリソースを使いましたが、すべてを無駄にしましたが、解決方法がわかりませんこの場合のサブ問題。最長増加サブシーケンスのアルゴリズムを理解できない

ソリューションの理解に役立つ説明があれば、感謝します。次のように

はこれまでのところ、私は最適なサブ構造特性を理解する:

例階乗:

ので40、事実(40)の階乗のために、我々は事実を計算することにより、ソリューションを実現することができます( 39)* 40、など39,38 .... 2 ans我々は、事実(2)が2であることを知っているので、同じ方法で2から40までそれを構築することができます。

しかし、私はLISの面で関係することはできませんよ、それは後で処理できるように、溶液の

完全な説明は、重複部分問題の問題を除いて、いいだろう助けてください。

ありがとうございました。

+0

こんにちは、Hiresh - あなたは偶然、再帰とLISを混乱させていますか?通常、LIS(再帰的であってもよい)のアルゴリズムは、入力としてのシーケンスを含む。 (通常、ソートするために、Oを決定するために)。与えられた階乗の例は再帰です。 – John

+0

こんにちはジョン、再帰的ですが、私は最適な基礎構造のプロパティを持っていると思う、小さな問題は最終的な問題を構築するために使用され、plsは私が間違っている場合私を修正します。 – Hiresh

+0

下記の答えを参照してください - N!の問題とその最適な構造は、N! (および導出されたシーケンス)は、長さNのLISを生成する。別の目的のために、異なる質問。 – John

答えて

0

最適な部分構造を検討する前に、LISの場合のサブ問題は何かを決定する必要があります。のは、この定義を使用してみましょう:長さNの配列a[N]

部分問題LIS[k]は要素a[k]で正確に終わる最初のインデックスから最長増加部分列の長さを見つけることです。

ここでの違いを理解することが重要である:LIS[k]は最初k要素にLISを解決ではありません。すべてiの場合kまではMax(LIS[i])となります。これは、特定の要素で終わる最長増加部分列の長さです。 Nまでの各iに対して

  • :手でこの定義に

    、それはLISへのソリューションを構築することは容易である

  • 設定LIS[i] 1の(最悪の場合には、その数はAです
  • 最初の要素からi-1までをjsのように検索すると、a[i] > a[j]LIS[j]+1 > LIS[i]のようになります。

なお、上記アルゴリズムはO(i)でi以下全てj秒間LIS[j]を部分問題するLIS[i]所与のソリューションに対する解決策を構築することを確認することは容易です。 k-1サブ問題の解からk問題への解を構築することができるので、問題は最適な部分構造を持っています。

注:上記は、バイナリ検索を使用してさらに最適化できます。しかし、サブ問題と最適な基礎構造についての推論は同じです。

+0

@dasblinkenlightに[http://stackoverflow.com/questions/43236912/how-does-finding-a-longest-increasing-subsequence-that-ends-with-a-particular-el](answer)をリクエストしたいと思います。これは私のために最終的に問題を解決します) – Hiresh

関連する問題