알고리즘/다이나믹프로그래밍

[BOJ/백준][Silver2] 11722. 가장 긴 감소하는 부분 수열(Kotlin)

꼬물쥰 2023. 2. 1. 02:11

https://www.acmicpc.net/problem/11053

 

11053번: 가장 긴 증가하는 부분 수열

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이

www.acmicpc.net

 

문제

수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10}  이고, 길이는 3이다.


입출력

[입력]

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)

 

[출력]

첫째 줄에 수열 A의 가장 긴 감소하는 부분 수열의 길이를 출력한다.


접근방법

이전 게시물에 아주 자세히 설명해놨으니 참고하면 될 것 같다.

여기에서 조건문부분만 변경하면 끝이다.


코드

import java.util.*

fun main(){
    val N = readLine()!!.toInt()
    val input = readLine()!!.split(" ").map{it.toInt()}
    val dp = IntArray(N){1}
    for(i in 1 until N){
        for(j in 0 until i){
            if(input[i] < input[j]){
                dp[i] = maxOf(dp[i], dp[j]+1)
            }
        }
    }
    println(dp.maxOrNull())
}