[JLIS] 문제
합친 최대 증가 부분 수열 찾기.
입력 값은 다음과 같습니다
12
3 3
1 2 4
3 4 7
3 3
1 2 3
4 5 6
5 3
10 20 30 1 2
10 20 30
3 3
1 9 4
3 4 7
1 1
100
100
5 5
2 7 7 7 1
5 9 3 6 3
5 5
3 4 5 7 2
6 4 8 9 1
1 2
4
4 7
1 1
1
1
3 5
1 1 1
2 2 2 2 2
5 5
3 4 5 7 2
6 4 8 9 1
2 3
-2147483648 -2147483648
-2147483648 -2147483648 -2147483648
출력값은 다음과 같습니다. (사람들 데이터 추가)
#1 5
#2 6
#3 5
#4 5
#5 1
#6 4
#7 7
#8 2
#9 1
#10 2
#11 7
#12 1
전체 코드는 다음과 같습니다.
//
// JLIS.cpp
// AALGGO
//
// Created by inhyeok on 2021/09/21.
//
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <limits>
using namespace std;
ifstream fin("JLIS.txt");
int cache[101][101];
int sequence1[101], sequence2[101];
int num1, num2;
const long long NEGINF = numeric_limits<long long>::min();
int LIS(int a, int b){
int &ret = cache[a+1][b+1];
if(ret != -1) return ret;
ret = 0;
long long A = (a==-1 ? NEGINF : sequence1[a]);
long long B = (b==-1 ? NEGINF : sequence2[b]);
long long maxElement = max(A,B);
for(int i = a + 1; i < num1; ++i){
if(maxElement < sequence1[i])
ret = max(ret, LIS(i,b) + 1);
}
for(int i = b + 1; i < num2; ++i){
if(maxElement < sequence2[i])
ret = max(ret, LIS(a,i) + 1);
}
return ret;
}
int main(int argc, const char * argv[]) {
int Test_case;
fin >> Test_case;
for (int i=0; i< Test_case ; i++){
fin >> num1;
fin >> num2;
memset(cache,-1,sizeof(cache));
memset(sequence1,-1,sizeof(sequence1));
memset(sequence2,-1,sizeof(sequence2));
for(int j=0; j< num1; j++){
fin >> sequence1[j];
}
for(int k=0; k<num2; k++){
fin >> sequence2[k];
}
cout << LIS(-1,-1) << endl;
}
return 0;
}
Comments