알고리즘 공부/DP

백준 1932번 with Kotlin

_우지 2021. 8. 21. 04:50

정수 삼각형 성공출처다국어

한국어   

시간 제한메모리 제한제출정답맞은 사람정답 비율

2 초 128 MB 49689 27257 20412 58.758%

문제

7 3 8 8 1 0 2 7 4 4 4 5 2 6 5

위 그림은 크기가 5인 정수 삼각형의 한 모습이다.

맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.

삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.

입력

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

출력

첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.

예제 입력 1 복사

5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5

예제 출력 1 복사

30

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
26
27
28
29
30
31
32
33
34
35
36
37
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.lang.Integer.max
import java.lang.Integer.min
 
 
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))
val n = readLine()!!.toInt()
val graph = MutableList(n+1,{ mutableListOf<Int>()})
val dp = Array(n,{kotlin.IntArray(n,{0})})
 
fun main()=with(br){
    for(i in 0 until n){
        var line = readLine()!!.split(" ").map{it.toInt()}.toMutableList()
        graph[i]=line
    }
    dp[0][0]=graph[0][0]
    for(i in 1 until n){
        dp[i][0]=dp[i-1][0]+graph[i][0]
        for(j in 1 until i){
            dp[i][j]=max(dp[i-1][j-1]+graph[i][j],dp[i-1][j]+graph[i][j])
        }
        dp[i][i]=dp[i-1][i-1]+graph[i][i]
    }
    var max = Int.MIN_VALUE
    for(i in 0 until n){
        if(max<dp[n-1][i]){
            max=dp[n-1][i]
        }
    }
    bw.write("$max")
    bw.flush()
    bw.close()
}
cs