알고리즘 공부/DP

백준1912번 with Kotlin

_우지 2021. 8. 25. 22:01

연속합 성공

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

1 초 (추가 시간 없음) 128 MB 87203 28338 19585 31.421%

문제

n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.

예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.

입력

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

출력

첫째 줄에 답을 출력한다.

예제 입력 1 복사

10 10 -4 3 1 5 6 -35 12 21 -1

예제 출력 1 복사

33

예제 입력 2 복사

10 2 1 -4 3 4 -4 6 5 -5 1

예제 출력 2 복사

14

예제 입력 3 복사

5 -1 -2 -3 -4 -5

예제 출력 3 복사

-1

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
38
39
40
41
42
43
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.lang.Integer.max
 
 
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))
val n = readLine()!!.toInt()
 
fun main()=with(br){
    val arr = IntArray(n)
    val dp = IntArray(n)
    for(i in 0 until n){
        arr[i]=readLine()!!.toInt()
    }
    if(n>=1){
        dp[0]=arr[0]
    }
    if(n>=2){
        dp[1]=arr[0]+arr[1]
    }
    if(n>=3){
        var happy = max((arr[0]+arr[1]),(arr[0]+arr[2]))
        dp[2]=max(happy,(arr[1]+arr[2]))
    }
    for(i in 3 until n){
        var tmp = max((dp[i-3]+arr[i-1]+arr[i]),dp[i-2]+arr[i])
        dp[i]=max(tmp,dp[i-1])
    }
    /*
    for(i in 0 until n){
        print("${dp[i]} ")
    }
    println()
     */
    print("${dp[n-1]}")
    bw.flush()
    bw.close()
}
 
cs