Algorithm/알고스팟

algospot - jlis

jhg0406 2020. 2. 2. 18:38
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//algospot - jlis
 
#include <iostream>
#include <vector>
using namespace std;
 
int N, M;
vector<long long> v1;
vector<long long> v2;
vector<vector<int>> cache;
 
void init()
{
    cin >> N >> M;
    v1 = vector<long long>(N+1);
    v2 = vector<long long>(M+1);
    cache = vector<vector<int>>(N + 1vector<int>(M+1-1));
    for (int i = 1; i <= N; ++i)
        cin >> v1[i];
    for (int i = 1; i <= M; ++i)
        cin >> v2[i];
    v1[0= v2[0= -3333333333;
}
 
int dp(int idx1, int idx2)
{
    int &ret = cache[idx1][idx2];
    if (ret != -1)
        return ret;
    ret = 0;
    long long num = max(v1[idx1], v2[idx2]);
    for (int i = idx1 + 1; i <= N; ++i)
        if (num < v1[i])
            ret = max(ret, dp(i, idx2));
 
    for (int i = idx2 + 1; i <= M; ++i)
        if (num < v2[i])
            ret = max(ret, dp(idx1, i));
 
    ++ret;
    return ret;
}
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int C;
    cin >> C;
    for (int tn = 0; tn < C; ++tn)
    {
        init();
        int ans = dp(00);
        cout << ans - 1 << "\n";
    }
}
cs

 

 

 

 

 

https://www.algospot.com/judge/problem/read/JLIS

 

algospot.com :: JLIS

합친 LIS 문제 정보 문제 어떤 수열에서 0개 이상의 숫자를 지운 결과를 원 수열의 부분 수열이라고 부릅니다. 예를 들어 '4 7 6'은 '4 3 7 6 9'의 부분 수열입니다. 중복된 숫자가 없고 오름 차순으로 정렬되어 있는 부분 수열들을 가리켜 증가 부분 수열이라고 부르지요. 예를 들어 '3 6 9'는 앞의 수열의 증가 부분 수열입니다. 두 개의 정수 수열 A 와 B 에서 각각 증가 부분 수열을 얻은 뒤 이들을 크기 순서대로 합친 것을 합친 증가 부

www.algospot.com

 

 

 

 

 

JLIS

DP문제

cache[A][B] : 첫번째 수열 A부터 시작하는 부분수열과 두번쨰 수열 B부터 시작하는 부분수열중 가장 큰 JLIS의 길이를 저장합니다.