연속합 성공
시간 제한메모리 제한제출정답맞은 사람정답 비율
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 |
'알고리즘 공부 > DP' 카테고리의 다른 글
백준 11054번 가장긴 바이토닉 부분 수열 with Kotlin (0) | 2021.09.06 |
---|---|
백준 9465번 with Kotlin (0) | 2021.09.01 |
백준 1932번 with Kotlin (0) | 2021.08.21 |
백준 1149번 with Kotlin (0) | 2021.08.21 |
백준 11727번 with Kotlin (0) | 2021.08.17 |