묻공러
[C++ 자/알 Note] LIS (Longest Increasing Subsequence) 문제
묻공러
묻지마공부
묻공러
전체
오늘
어제
  • 분류 전체보기 (521) N
    • C (54)
      • [코드조선] C 핵심 (35)
      • [언어본색] C 기초 (19)
    • C++ (72)
      • [루키스] C++ (9)
      • [루키스] 콜백함수 (6)
      • [루키스] STL (8)
      • [루키스] Modern C++ (11)
      • [노코프] C++ (10)
      • [노코프] Tips (16)
      • [일지] C++ (12)
    • C# (20) N
      • [루키스] C# (9)
      • [루키스] 자료구조 (3)
      • [루키스] 실전 문법 (8) N
    • 자료구조 & 알고리즘 (50)
      • [코드조선] C 자료구조 & 알고리즘 (6)
      • [합격자되기] C++ 코딩테스트 (12)
      • [루키스] C++ 자료구조 & 알고리즘 (32)
    • CS (69)
      • [널널한 개발자] CS 개론 (19)
      • [혼자 공부하는] 컴퓨터 구조 (16)
      • [혼자 공부하는] 운영체제 (18)
      • [널널한 개발자] 네트워크 (16)
    • 게임 그래픽스 (46)
      • [전북대] OpenGL (25)
      • [일지] DirectX (21)
    • 게임 엔진 - 언리얼 (123)
      • [코드조선] 언리얼 (53)
      • [코드조선] 언리얼 데디서버 (8)
      • [일지] 언리얼 (59)
      • [일지] 언리얼 (2) (3)
    • 게임 엔진 - 유니티 (14) N
      • [최적화] 유니티 (4)
      • [루키스] 유니티 (10) N
    • 게임 서버 (17)
    • 게임 수학 & 물리 (19)
      • 게임 수학 (12)
      • 게임 물리 (7)
    • GIT & GITHUB (4)
    • 영어 (18)
      • [The Outfit] 대본 공부 (11)
      • the others (7)
    • 그 외 (14)
      • In (5)
      • Out (5)
      • Review (4)

인기 글

최근 글

hELLO · Designed By 정상우.
자료구조 & 알고리즘/[루키스] C++ 자료구조 & 알고리즘

[C++ 자/알 Note] LIS (Longest Increasing Subsequence) 문제

2025. 1. 26. 23:22

LIS 개념

- Sequence(수열)

수를 나열한 것을 의미한다

ex. 1 9 2 5 7

 

- Subsequence(부분 수열)

기존 수열의 순서는 유지한 채로 일부 숫자를 지우고 남은 수열을 의미한다
ex. 기존 수열이 1 9 2 5 7이라는 가정하에

1 2 5, 1 9 5 7,...


- Increasing Subsequence(순 증가 부분 수열)

증가하는 규칙이 지켜진 부분 수열을 의미한다

ex. 1 2 5 (O), 1 9 7 (X)

- LIS(Longest Increasing Subsequence, 최장 증가 부분 수열)

제일 긴 Increasing Subsequence을 의미한다
ex. 기존 수열이 1 9 2 5 7이라는 가정하에

1 2 5 7 -> length가 4로 가장 길다

 

LIS 구현 주의사항 with 동적계획법

- 동적계획법의 코드 형식

기본적으로 동적계획법을 사용하는 경우

코드를 작성할 때는 "기저사항 -> 캐시확인 -> 연산" 형식으로 진행하는 것이 좋다

 

- LIS(int pos)

LIS의 시작위치(index)를 지정해서

먼저 해당 인덱스는 선택을 하고 경우의 수를 찾도록 구현한다

그러다 보니 최종적으로 모든 원소들을 시작위치로 지정해서

한 번씩 다 실행해줘야 한다

 

- 전반적인 논리

기존 수열이 3 1 9 5 7이라는 가정하에

3을 시작위치로 선택해서 LIS(0)을 호출했다면,

다음으로는 for문을 돌면서 자신보다 큰 수들만

LIS(N)를 호출해 주면 된다

ex. 3 -> 9, 5, 7 재귀적으로 호출

3 -> 9 -> X

3 -> 5 -> 7

3 -> 7 -> X

 

- LIS() 재귀

LIS함수가 재귀적으로 호출될 때마다

LIS의 길이가 1씩 증가되기 때문에

"1 + LIS(next)"로 작성을 해서 증가부분수열의 길이를 반환하도록 한다

 

- max(a, b)

a와 b 중에 큰 값을 반환한다

해당 함수를 이용해서 쉽게 최대치를 저장해 반환할 수 있다

 

LIS 구현 with 동적계획법

int cache[100];
vector<int> seq;

int LIS(int pos)
{
	// 기저사항
    // 딱히 없기에 미작성 

	// 캐시확인
	int& ret = cache[pos];
	if (ret != -1)
		return ret;

	// 연산
    
	ret = 1;// 최소 seq[pos]은 있으니 1부터 시작

	// 구하기
	for (int next = pos + 1; next < seq.size(); next++)
		if (seq[pos] < seq[next])
			ret = max(ret, 1 + LIS(next));

	return ret;
}

int main()
{
	::memset(cache, -1, sizeof(cache));
	seq = vector<int>{ 10, 1, 9, 2, 5, 7 };

	int ret = 0;
	for (int pos = 0; pos < seq.size(); pos++)
		ret = max(ret, LIS(pos));

}
저작자표시 비영리 변경금지 (새창열림)

'자료구조 & 알고리즘 > [루키스] C++ 자료구조 & 알고리즘' 카테고리의 다른 글

[C++ 자/알 Note] TRIANGLE PATH 문제  (0) 2025.01.27
[C++ 자/알 Note] 동적계획법 입문  (1) 2025.01.26
[C++ 자/알 Note] Prim 알고리즘 적용 (미로 생성)  (0) 2025.01.24
[C++ 자/알 Note] Prim 알고리즘  (0) 2025.01.24
[C++ 자/알 Note] Kruskal 알고리즘 적용 (미로 생성)  (0) 2025.01.24
'자료구조 & 알고리즘/[루키스] C++ 자료구조 & 알고리즘' 카테고리의 다른 글
  • [C++ 자/알 Note] TRIANGLE PATH 문제
  • [C++ 자/알 Note] 동적계획법 입문
  • [C++ 자/알 Note] Prim 알고리즘 적용 (미로 생성)
  • [C++ 자/알 Note] Prim 알고리즘
묻공러
묻공러
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.