티스토리 뷰
#. Problem
* The copyright in this matter is in BOJ
#. Solve
전형적인 DP, LIS 문제이다.
자세한 동작 설명은 문제를 참고해보자.
#. Python Code
1 2 3 4 5 6 7 8 9 10 | import copy N, A = int(input()), list(map(int, input().split())) dp = copy.deepcopy(A) for i in range(1, N): for j in range(i): if A[i] > A[j]: dp[i] = max(dp[i], dp[j] + A[i]) print(max(dp)) | cs |
line 3) 자기 자신이 가장 긴 증가 부분 수열이 될 수 있으므로 수열 A를 deepcopy
line 7) j번째 정수보다 클 때, dp[i]와 dp[j]+A[i]의 max를 dp[i]에 저장
#. Cpp Code
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 | #include <cstdio> #include <algorithm> using namespace std; int A[1001], DP[1001]; int main(void) { int n, i, j, res = 0; scanf("%d", &n); for (i = 1; i <= n; i++) { scanf("%d", &A[i]); for (j = 0; j < i; j++) if (A[i] > A[j] && DP[j] + A[i] > DP[i]) DP[i] = DP[j] + A[i]; if (DP[i] > res) res = DP[i]; } printf("%d\n", res); return 0; } | cs |
################
#. Problem
* The copyright in this matter is in BOJ
#. Solve
11055문제의 상위(?)버전의 문제이다.
사실 똑같은데 가장 긴 증가하는 부분 수열의 길이와
가장 긴 증가하는 부분 수열을 출력해주어야 한다..
#. Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | N, A = int(input()), list(map(int, input().split())) DP = [1 for _ in range(N)] rev = [i for i in range(N)] max_idx = 0 for i in range(N): for j in range(i): if A[i] > A[j] and DP[i] < DP[j] + 1: DP[i] = DP[j] + 1 rev[i] = j if DP[max_idx] < DP[i]: max_idx = i tmp = [] while max_idx != rev[max_idx]: tmp.append(A[max_idx]) max_idx = rev[max_idx] tmp.append(A[max_idx]), tmp.reverse() print(max(DP)) for i in tmp: print(i, end=' ') | cs |
line 8) 증가 수열에 해당하고 부분 수열의 길이가 기존 길이보다 클 경우
line 9) DP[i]를 갱신해주고
line 10) 어떤 idx가 증가수열에 포함되었는지 저장
line 12) 최대 길이를 갖는 idx 구하기
(기존 최대 길이보다 긴 길이를 갖는 idx가 있다면 갱신)
line 16) 최대 길이를 갖는 idx가 어떤 idx를 참조했는지 확인하면서,
최대 길이 idx가 자기 자신을 참조할 때까지 반복
line 17) 참조한 정수를 tmp list에 append
line 18) 참조한 idx가 어떤 idx를 또 참조했는지 확인하기 위해 max_idx를 갱신
line 19) 처음으로 참조된 정수를 마무리로 append해주고, tmp list를 reverse (오름차순으로 출력하기 위함)
'PS > Problem_Solving' 카테고리의 다른 글
[BOJ] 1915. 가장 큰 정사각형(DP).py.cpp (0) | 2020.06.05 |
---|---|
[BOJ] 2167. 2차원 배열의 합(DP, 누적합).py.cpp (0) | 2020.06.04 |
[BOJ] 1932.정수삼각형.py.cpp (DP 기초) (0) | 2020.06.03 |
[Inflearn] 회장뽑기(DP, 플로이드-워셜, Floyd-Warshall Algorithm) (0) | 2020.06.01 |
[Algorithm] 플로이드-워셜 알고리즘(Floyd-Warshall Algorithm) (9) | 2020.06.01 |