let n = Int(readLine()!)!
let num = readLine()!.split(separator: " ").map{Int(String($0))!}
var dp = [Int:Int]()
var result = [Int]()
// LIS (최장부분수열 찾기)
for i in 0..<n {
dp[i] = 1
for j in (0..<i).reversed() {
if num[i] > num[j] {
dp[i] = max(dp[i]!, dp[j]!+1)
}
}
}
// 최장부분수열을 역으로 배열에서 찾아서 출력
let lisIndex = dp.keys.filter{dp[$0] == dp.values.max()!}
var index = lisIndex[0]
result.append(num[index])
for i in (0..<lisIndex[0]).reversed() {
if dp[i] == dp[index]! - 1 && num[i] < result.last! {
result.append(num[i])
index = i
}
}
print(dp[lisIndex[0]]!)
print(result.reversed().map{String($0)}.joined(separator: " "))
최장부분수열만 찾는건 크게 어렵지 않았지만
그 값을 출력해야하는 게 까다로웠다..
O(N^2)이기도 하고 코드가 깔끔하지가 않아서..
다른 코드도 조금 둘러보는 게 좋을듯..
'알고리즘문풀 with SWIFT > Baekjoon' 카테고리의 다른 글
swift ) 백준 1966 - 프린터 큐 (0) | 2022.07.01 |
---|---|
swift ) 백준 1924 - 2007 (0) | 2022.06.29 |
swift ) 백준 9251 - LCS (0) | 2022.06.25 |
swift ) 백준 2502 - 떡먹는호랑이 (0) | 2022.06.24 |
swift ) 백준 17413 - 단어 뒤집기 2 (0) | 2022.06.23 |