PS/백준
[백준] 11722 가장 긴 감소하는 부분 수열
Hamp
2024. 10. 13. 19:01
반응형

문제
https://www.acmicpc.net/problem/11722
입력
n: Int = 수열의 길이
arr: [Int] = 수열
1 <= n <= 1000
1 <= arr[i] <= 1000
결과
ans: Int = 가장 긴 감소하는 부분 수열 길이
해석
LIS의 형태로 간단한 점화식을 세울 수 있다.
dp[i] = i 전까지 가장 긴 감소하는 부분 수열 길이
반복문 한개는 i = 현재 값 , 나머지 반복문 j = i 직전까지
총 최대 1000 x 1000을 돌며 arr[j] > arr[i] 일 때 dp 배열을 갱신한다.
코드
import Foundation
let n = Int(readLine()!)!
let arr = [-1] + readLine()!.components(separatedBy: " ").map{Int($0)!}
var dp: [Int] = [Int](repeating: 0, count: n+1) // dp[i] = arr[i] 전 까지 가장 긴 감소하는 수열
var ans: Int = 0
for i in 1...n {
for j in 1..<i {
if arr[i] < arr[j] {
dp[i] = max(dp[i], dp[j] + 1)
ans = max(ans, dp[i])
}
}
}
print(ans+1) // 자신을 길이에 추가
반응형