문제:
https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
코드:
import java.util.*;
public class Main {
public static int n;
public static int [] arr = new int[100005];
public static int [] dp = new int[100005];
public static void run(){
for(int i=1;i<n;i++){
dp[i] = Math.max(dp[i-1]+arr[i] , arr[i]);
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for(int i=0;i<n;i++){
arr[i] = sc.nextInt();
}
dp[0] = arr[0];
run();
int maxval = Integer.MIN_VALUE;
for(int i=0;i<n;i++){
maxval = Math.max(maxval, dp[i]);
}
System.out.println(maxval);
}
}
초기값
dp[0] = arr[0]
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
점화식
dp[i] = Math.max(dp[i-1]+arr[i] , arr[i]);
dp[i] 는 dp[i-1]+arr[i]와 arr[i] 중 최대값
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
예시
10 -4 3 1 5 6 -35 12 21 -1
dp[i]
10 6 9 10 15 21 -14 12 33 32
dp[6](-35) 까지는 계속 연속해서 더한 값이 최대가 되지만
dp[7]에선 (dp[6]+arr[7] = 2) < (arr[7] = 12) 이기 때문에
dp[7] = arr[7]이 된다.
'Java > 백준' 카테고리의 다른 글
[Java][9084] 동전 (0) | 2022.11.17 |
---|---|
[Java][11052] 카드 구매하기 (0) | 2022.11.16 |
[Java][1932] 정수 삼각형 (1) | 2022.11.10 |
[Java][11656] 접미사 배열 (0) | 2022.11.07 |
[Java][2910] 빈도 정렬 (0) | 2022.11.07 |