https://www.acmicpc.net/problem/1912
방법 1: Top-down
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
44
45
|
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int[] arrNumbers;
static int[] arrTempSerialSum;
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int iTotal = Integer.parseInt(br.readLine());
arrNumbers = new int[iTotal];
arrTempSerialSum= new int[iTotal];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < iTotal; i++) {
arrNumbers[i] = Integer.parseInt(st.nextToken());
}
System.out.println(calculate(iTotal - 1, arrNumbers[0]));
} catch (Exception e) {
e.printStackTrace();
}
}
public static int calculate(int i, int iResultMax) {
if (i == 0) {
arrTempSerialSum[i] = arrNumbers[i];
return iResultMax;
}
iResultMax = calculate(i - 1, iResultMax);
arrTempSerialSum[i] = Math.max(arrTempSerialSum[i - 1] + arrNumbers[i], arrNumbers[i]);
if (iResultMax < arrTempSerialSum[i]) {
iResultMax = arrTempSerialSum[i];
}
return iResultMax;
}
}
Colored by Color Scripter
|
방법 2: Bottom-up
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
|
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int iTotal = Integer.parseInt(br.readLine());
int[] arrNumbers = new int[iTotal];
int[] arrTempSerialSum = new int[iTotal];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < iTotal; i++) {
arrNumbers[i] = Integer.parseInt(st.nextToken());
}
arrTempSerialSum[0] = arrNumbers[0];
int iResultMax = arrTempSerialSum[0];
for (int i = 1; i < iTotal; i++) {
arrTempSerialSum[i] = Math.max(arrTempSerialSum[i - 1] + arrNumbers[i], arrNumbers[i]);
if (iResultMax < arrTempSerialSum[i]) {
iResultMax = arrTempSerialSum[i];
}
}
System.out.println(iResultMax);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Colored by Color Scripter
|
c++소스
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
44
45
46
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// 입력
int n;
cin >> n;
vector<int> A(n);
for (int i = 0; i < n; i++)
{
cin >> A[i];
}
/*
점화식 : D[i] = i번째 수로 끝나는 가장 큰 연속합
--> D[i - 1] >= 0 이라면 연속합 계산.
--> D[i - 1] < 0 이면 A[i]로 새로운 연속합 시작.
*/
vector<int> S(n);
S[0] = A[0];
for (int i = 1; i < n; i++)
{
if (S[i - 1] >= 0)
{
S[i] = S[i - 1] + A[i];
}
else
{
S[i] = A[i];
}
}
// 가장 큰 연속합 출력
cout << *max_element(S.begin(), S.end());
return 0;
}
Colored by Color Scripter
|
바텁업이 더 효율적이다.
TIP1
A[N] 까지 더한 연속합을 D[N]이라 하자.
D[N - 1] + A[N] 와 A[N] 의 크기를 비교하여
더 큰 것을 D[N]에 대입한다
TIP2
D[끝값]이 가장 큰 값이 아닐 수 있다!
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ]2225번: 합분해(java) (0) | 2019.10.19 |
---|---|
[BOJ]1699번: 제곱수의 합(java, c++) (0) | 2019.10.19 |
[BOJ]14002번: 가장 긴 증가하는 부분 수열 4(java) (0) | 2019.10.18 |
[BOJ]11053번: 가장 긴 증가하는 부분 수열(java, c++) (0) | 2019.10.17 |
[BOJ]2193번: 이친수(java, c++) (0) | 2019.10.17 |
댓글