반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 테이블
- 인텔리제이
- IntelliJ
- Files
- html
- Visual Studio Code
- Array
- windows
- js
- Java
- 이클립스
- 배열
- Button
- json
- input
- Maven
- date
- javascript
- CMD
- Eclipse
- 자바스크립트
- 자바
- list
- vscode
- string
- table
- 문자열
- ArrayList
- CSS
- 이탈리아
Archives
- Today
- Total
어제 오늘 내일
[백준 알고리즘] 1912 연속합(with Java) 본문
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 |
3 |
1 |
5 |
6 |
-35 |
12 |
21 |
-1 |
temp |
10 |
6 |
9 |
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])
......
이렇게 하면 모든 경우의 수를 일일이 계산하지 않아도
연속합의 최대값을 구할 수 있다.
반응형
'IT > Algorithm' 카테고리의 다른 글
[백준 알고리즘] 2292 벌집(with Java) (1) | 2016.09.18 |
---|---|
[백준 알고리즘] 1924 2007년(with Java) (4) | 2016.09.17 |
[백준 알고리즘] 1922 네트워크 연결(with Java) (0) | 2016.09.16 |
[백준 알고리즘] 1152 단어의 개수(with Java) (1) | 2016.09.14 |
[백준 알고리즘] 1065 한수 풀이(with Java) (0) | 2016.09.13 |
Comments