이거 꽤 중요하다고 한다.
LIS (Longest Increasing Subsequence)라고 따로 명칭이 있는 알고리즘이다.
풀이법은 입력된 수열에서의 비교와
새로운 배열을 하나 생성해
그 수가 몇번 째에 놓일 수 있는지, 두가지 비교를 하는 것이다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
예를들어
2, 1, 2 이렇게 3개의 수가 있다고 가정하면
첫번쨰 수 2는 생성될 부분 수열의 첫번째에 놓일수 있으니
D[0] = 1이다.
두번째 수 1 또한 생성될 부분 수열의 첫번쨰에 놓일수 있으니
D[1] = 1이다.
그리고 첫번쨰 수 2의 뒤에 놓일 수 없기떄문에 그래로 1.
세번 쨰 수 2는 우선, 생성될 부분 수열의 첫번째에 놓일 수 있으니 D[2]=1이다.
또한 두번째 수인 1의 뒤에 놓일 수 있으니 D[1]에서 1을 더해준 2가 된다.
첫번째 수인 2의 뒤에는 놓일 수 없으니 무시.
이렇게 되면 배열 D의 값은
1, 1, 2 가 되므로 최대값인 2가 답이 된다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
긴 예를 들면 (5,1,4,2,7,6,3,9,2)
이렇게 되므로 최대값인 4가 답이 되는 것
코드는
1 2 3 4 5 6 7 8 9 10 | for (int i = 0; i < n; i++) { d[i] = 1; for (int j = 0; j < i; j++) { if (arr[j] < arr[i] && d[i] < d[j] + 1) { d[i] = d[j] + 1; } } } | cs |
점화식은
arr[j] < arr[i] 일떄,
d[i] = max(d[j]) +1
'BOJ' 카테고리의 다른 글
백준 1912 / 연속합 (0) | 2018.12.28 |
---|---|
백준 14002 / 가장 긴 증가하는 부분 수열 4 (0) | 2018.12.27 |
백준 15990 / 1,2,3 더하기 5 (0) | 2018.12.26 |
백준 1463 / 1로 만들기 (0) | 2018.12.20 |
백준 3055 / 탈출 (0) | 2018.12.20 |