DP3上昇最長シーケンスLIS @ geeksforgeeks



Dp3 Rise Longest Sequence Lis Geeksforgeeks



動的計画法を使用して解決できる問題の例として、最長増加部分列(LIS)問題について説明します。
最長増加部分列(LIS)の問題は、サブシーケンスのすべての要素が昇順で並べ替えられるように、特定のシーケンスの最長サブシーケンスの長さを見つけることです。たとえば、{10、22、9、33、21、50、41、60、80}のLISの長さは6で、LISは{10、22、33、50、60、80}です。

最適な下部構造:
arr [0..n-1]を入力配列、L(i)をインデックスiまでのLISの長さとして、arr [i]がLISの一部であり、arr [i]がLISの最後の要素になるようにします。その場合、L(i)は再帰的にとして書くことができます。
L(i)= {1 + Max(L(j))}ここで、j
特定の配列のLISを取得するには、max(L(i))を返す必要があります。ここで0 したがって、LIS問題は、サブ問題の解決策を使用して主な問題を解決できるため、最適な部分構造特性を備えています。



重複するサブ問題:
以下は、LIS問題の単純な再帰的実装です。実装は、上記の再帰的構造に従うだけです。すべての要素で終わるlisの値は、max_ending_hereを使用して返されます。全体的なlisは、変数maxへのポインターを使用して返されます。


package DP import java.util.Arrays // longest increasing subsequence -Longest Increasing Subsequence /** Let arr[0..n-1] be the input array and L(i) be the length of the LIS till index i such that arr[i] is part of LIS and arr[i] is the last element in LIS L(i) = { 1 + Max ( L(j) ) } where j
http://www.geeksforgeeks.org/dynamic-programming-set-3-longest-increasing-subsequence/