두 문자열을 입력받아 특정 DP 문제를 해결하는 예시로, C++의 고성능 최적화와 메모리 관리 기법을 중심으로 구성된 내용이다. 코드의 핵심은 컴파일러 최적화와 메모리 절약, 그리고 포인터를 활용한 참조 속도 향상에 있다. 최적화 수단으로는 #pragma GCC optimize("O3,unroll-loops")를 상단에 배치해 루프 언롤링과 전체 실행 속도 향상을 도모하고, 메모리 사용을 줄이기 위해 배열 원소를 short 타입으로 제한한다. 최대 7000 x 7000 규모를 고려해 2바이트 단위의 저장 공간으로 필요한 메모리Usage를 절반으로 감소시키는 것이 목적이다. 반복문 내부의 배열 접근은 지역 포인터를 통해 인덱스 계산 오버헤드를 줄이는 방식으로 구현된다.
구성은 먼저 입력 및 초기화 부분이다. a와 b는 입력 문자열로, ih와 iv 두 개의 2차원 DP 배열에 각각 수평 방향과 수직 방향의 연산 결과를 저장한다. ih[0][j]는 j로, iv[i][0]은 0으로 초기화한다. 이후 이행 단계에서 i와 j를 차례로 순회하며 문자 비교 결과에 따라 두 배열의 값을 갱신한다. ca = a[i-1]를 미리 참조로 빼두고, 내부에서의 포인터 가능 참조로 ih[i], ih[i-1], iv[i], iv[i-1] 등의 배열을 접근한다. 일치하는 경우와 불일치하는 경우를 구분해 두 배열의 값을 각각 갱신하는 방식이며, 반복마다 최적화를 위한 로직이 적용된다.
결과 계산 부분은 ih 배열의 값들을 기반으로 특정 조건을 만족하는 항들을 더하는 방식이다. val < k인 경우에만 기여가 발생하도록 하여 전체 계산을 효율화한다. 이때 전체 시간 복잡도는 각각의 DP 채우기와 결과 계산이 서로 O(n*m)로, 전형적인 2차원 DP의 복잡도와 같다. 배열 접근 최적화와 메모리 절약의 효과를 강조하며, 실행 성능 향상을 위한 포인터 활용과 매 반복에서의 참조 감소를 핵심 포인트로 제시한다.
코드의 시간 복잡도와 메모리 절감의 관계를 명시하고, 컴파일러 최적화와 포인터 기반 참조의 결합이 대규모 입력에서 실질적인 차이를 만든다고 설명한다. 또한 코드의 완성 예로 C++ 외에 Python 버전의 아이디어를 덧붙여, 1차원 배열로의 재구성이나 짧은 정수형 배열 활용 등 다양한 구현 접근이 존재함을 보여준다. 실행 예시로 입력 두 문자열과 간단한 수치를 제시하는 형태로 끝난다.
원문 링크 : [백준] 25954 LCS 9 C++,번외 PyPy3