어제 오늘 내일

[백준 알고리즘] 1912 연속합(with Java) 본문

IT/Algorithm

[백준 알고리즘] 1912 연속합(with Java)

hi.anna 2016. 9. 15. 06:30



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


주어진 수열에서 연속된 숫자의 가장 큰합을 구하는 문제이다.


가장 직관적인 방법으로 모든 케이스를 돌려보는 방법이 있다.


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


이와 같은 수열일 경우

10 = 10

10 + -4 = 6

10 + -4 + 3 = 9

.....

-4 + 3 = -1

-4 + 3 + 1 = 0

....

-1

이런식으로 모든 경우의 수를 만들어서 다 돌려보는 것이다.




위의 소스에서 solve1() 메소드는 앞에서 설명한 것과 같이
모든 케이스를 다 만들어서 계산하도록 구현한 것이다.
하지만 결과는 시간 초과!

고민고민 끝에 solve2() 메소드를 새로 만들었다.
방법은 
DP(Dynamic Programming, 동적계획법)!

현재 index의 숫자와
지난 index까지의 최대합을 계속해서 비교해 나가는 방식이다.

 

 [0]

 [1]

[2] 

[3] 

[4] 

[5] 

[6] 

[7] 

[8] 

[9] 

 numbers

10 

-4 

-35 

12 

21 

-1 

 temp

10 

10 

15 

21 

-14

12 

33 

32 


위 표에서 

temp[0] = max(0, number[0])

temp[1] = max(temp[0] + number[1], number[1])

temp[2] = max(temp[1] + number[2], number[2])

temp[3] = max(temp[2] + number[3], number[3])

......


이렇게 하면 모든 경우의 수를 일일이 계산하지 않아도

연속합의 최대값을 구할 수 있다.



반응형
Comments