Paste will expire never.
- // Очно-заочный кружок
- // Занятие №8. Учебные задачи
- // Задача A. Наибольшая общая подпоследовательность
- // ibelyaev: 24Oct2011
- // http://cppalgo.blogspot.com/2011/04/blog-post.htm
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <string>
- #include <string.h>
- #include <cmath>
- #include <queue>
- #include <vector>
- #include <map>
- #include <stdlib.h> // for exit(0)
- #include <stack>
- #include <list>
- #include <ctime>
- #include <set>
- using namespace std;
- int n,m;
- vector<int> A,B;
- vector<vector<int> > mem;
- void input(vector<int> &mas, int &size) {
- scanf("%d",&size);
- mas.resize(size);
- for (int i=0;i<size;++i)
- scanf("%d", &mas[i]);
- }
- void input(){
- input(A,n);
- input(B,m);
- mem.resize(n,vector<int>(m,-1));
- }
- int LCS(int a, int b) {
- if (a < 0 || b < 0) return 0;
- if (mem[a][b] != -1)
- return mem[a][b];
- int res;
- if (A[a] == B[b])
- res = LCS(a-1,b-1) + 1;
- else
- res = max(LCS(a-1,b),LCS(a,b-1));
- return mem[a][b] = res;
- }
- void solve(){
- printf("%d", LCS(n-1, m-1));
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- input();
- solve();
- return 0;
- }
Editing is locked.