336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
https://www.acmicpc.net/problem/1912
이 문제는
수열이 주어질 때 연속한 수를 선택하여 연속합을 구하는 문제임.
10 -4 3 1 5 6 -35 12 21 -1
이 입력으로 주어지면 12 + 21 이 33이므로 가장 큰 연속합이 됨.
[입력]
n
a1 a2... an-1 an
수열의 갯수 n이 주어지고
a1 a2 ... an-1 an 이 주어진다.
[출력]
수열 중 가장 큰 연속합을 구한다.
동적계획법으로 구할 수 있다. 출력 값을 ans
그리고 ans 보다 큰 값이 나오면 ans의 값을 갱신한다.
(1) input[i] : i번째 수
(2) memo[i] : i번째 까지 연속합 중 가장 큰 연속합
(3) memo[i-1] + input[i] : i-1번째 연속합 중 가장 큰 연속합 이며, i번째 수를 택한 수
(3) 에서 이 수가 0보다 작은 경우 if( (3) < 0 )
이후 값을 더하더라도 음수의 값을 누적하여 가지고 있으므로 더하여도 최대 연속합이 될 수 없다.
그러기 때문에 if( (3) >= 0 ) 인 값만이 연속합이 될 수 있다.
위 조건을 만족할 때만 memo[i]를 갱신한다.
그리고 ans 보다 값이 클 경우 ans을 갱신한다.
위 과정을 반복하면 연속합의 최대값을 구할 수 있다.
9달전에 왜 이렇게 밖에 생각 못했을까 싶은데 코드는 추가함.
'PSNote > Problem Solving' 카테고리의 다른 글
[BOJ-2156]포도주 시식 (0) | 2017.07.18 |
---|---|
[BOJ-13398]연속합 2 (0) | 2017.07.18 |
[BOJ-3085]사탕게임 (0) | 2017.07.17 |
[BOJ-11051]이항계수2 (0) | 2017.07.17 |
[BOJ-1094]막대기 (0) | 2017.07.17 |