**უგრძესი საერთო ქვემიმდევრობის (უსქ) ამოცანა** — ამოცანა, რომელიც ეძებს მიმდევრობებს შორის უგრძეს საერთო ქვემიმდევრობას (ძირითადად ორ მიმდევრობაზე განიხილავენ). 

მაგალითად, განვიხილოთ ორი მიმდევრობა (ABCD) და (ACBAD). მათ 5 უსქ აქვთ, სიგრძით 2: (AB),(AC),(AD),(BD) და (CD); 2 უსქ, სიგრძით 3: (ABD) და (ACD); უფრო გრძელი კი არ გვაქვს. შესაბამისად, (ABC) და (ACD) არის უგრძესი საერთო ქვემიმდევრობა.

სირთულე
-------

ეს ამოცანა არის NP-რთული ამოცანა. ის დინამიური პროგრამირების პრინციპით პოლინომიურ დროში იხსნება.

მოცემულია {\displaystyle N} სიგრძეების მიმდევრობები {\displaystyle n\_{1},...n\_{N}}, სრული ძებნა შეამოწმებს თითოეულ მათგანის {\displaystyle 2^{n\_{1}}} ქვესიმრავლეს, რათა დაადგინოს, არიან თუ არა ისინი აგრეთვე დანარჩენი მიმდევრობების ქვემიმდევრობები; მოცემული ამოცანის დროის სირთულე იქნება 

{\displaystyle O\left(2^{n\_{1}}\sum \_{i>1}n\_{i}\right).}
n და m სიგრძის ორი მიმდევრობისთვის დროის სირთულე დინამიური პროგრამირებით იქნება O(n × m). ნებისმიერი რაოდენობის ქვემიმდევრობისთვის დინამიური პროგრამირების ამოხსნის დროის სირთულე იქნება 

{\displaystyle O\left(N\prod \_{i=1}^{N}n\_{i}\right).}

ამოხსნა ორი მიმდევრობისთვის
---------------------------

### LCS ფუნქცია

განვსაზღვროთ ორი მიმდევრობა შემდეგნაირად: {\displaystyle X=(x\_{1}x\_{2}\cdots x\_{m})} და {\displaystyle Y=(y\_{1}y\_{2}\cdots y\_{n})}. {\displaystyle X}-ის პრეფიქსები არიან {\displaystyle X\_{1,2,\dots ,m}} ; {\displaystyle Y}-ის კი {\displaystyle Y\_{1,2,\dots ,n}} .{\displaystyle {\mathit {LCS}}(X\_{i},Y\_{j})} -ით აღვნიშნოთ უგრძესი საერთო ქვემიმდევრობა პრეფიქსებისთვის {\displaystyle X\_{i}} და {\displaystyle Y\_{j}}. 

{\displaystyle {\mathit {LCS}}(X\_{i},Y\_{j})={\begin{cases}\emptyset &{\mbox{თუ }}i=0{\mbox{ ან }}j=0\\{\mathit {LCS}}(X\_{i-1},Y\_{j-1})+1&{\mbox{თუ }}i,j>0{\mbox{ და }}x\_{i}=y\_{j}\\\operatorname {\max } \{{\mathit {LCS}}(X\_{i},Y\_{j-1}),{\mathit {LCS}}(X\_{i-1},Y\_{j})\}&{\mbox{თუ }}i,j>0{\mbox{ და }}x\_{i}\neq y\_{j}.\end{cases}}}
რათა ვიპოვოთ LCS {\displaystyle X\_{i}} და {\displaystyle Y\_{j}}-თვის, შევადაროთ {\displaystyle x\_{i}} და {\displaystyle y\_{j}}. თუ ისინი ტოლია, მაშინ ქვემიმდევრობა {\displaystyle {\mathit {LCS}}(X\_{i-1},Y\_{j-1})} -ზე ერთით მეტი იქნება. თუ ისინი ტოლი არ არიან, მაშინ {\displaystyle {\mathit {LCS}}(X\_{i},Y\_{j-1})}, და {\displaystyle {\mathit {LCS}}(X\_{i-1},Y\_{j})} შორის უგრძესის ტოლი გახდება.

იმპლემენტაცია C++-ზე
--------------------

```
int dp[1000][1000];
int getLCS(vector<int>a,vector<int>b){
 int n=a.size();
 int m=b.size();
 for(int i=1; i<=n; i++){
 for(int j=1; j<=m; j++){
 if(a[i-1]==b[j-1]){
 dp[i][j]=1+dp[i-1][j-1];
 }else{
 dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
 }
 }
 }return dp[n][m];
}

```

რესურსები ინტერნეტში
--------------------

* Dictionary of Algorithms and Data Structures: longest common subsequence
* A collection of implementations of the longest common subsequence in many programming languages
* Implementation of Longest Common Subsequence Algorithm in C Programming Language

სქოლიო
------

1. ↑  David Maier (1978). „The Complexity of Some Problems on Subsequences and Supersequences". *J. ACM*. ACM Press. **25** (2): 322–336. doi:10.1145/322063.322075.
2. ↑  Wagner, Robert; Fischer, Michael (January 1974). „The string-to-string correction problem" (PDF). *Journal of the ACM*. **21** (1): 168–173. doi:10.1145/321796.321811. ციტირების თარიღი: 2018-05-03.