크기가 n인 정수 배열 arr[n] 에서 연속된 수의 최대값을 구하기 위해 크기가 n인 정수 배열 dp를 하나 만들어 준다.
dp[i] = arr[i]에서의 연속된 최대 합
최대 값이 될수 있는 경우는 총 3가지이다.
1) i-1에서의 최대 연속합 + arr[i]
2) 연속된 두 수의 합이 최대인 경우 (arr[i-1]+arr[i])
3) arr[i]가 최대합인 경우
이를 점화식으로 만들면 코드는 다음과 같다
for(int i=0; i<n; i++) {
if(i==0) {
dp[0]=arr[i];
}
else {
dp[i]=Math.max(dp[i-1]+arr[i],arr[i-1]+arr[i]);
if(dp[i]<arr[i]) {
dp[i]=arr[i];
}
}
}
정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
long[] arr= new long[n];
long[] dp=new long[n];
for(int i=0; i<n; i++) {
arr[i]=scanner.nextInt();
}
for(int i=0; i<n; i++) {
if(i==0) {
dp[0]=arr[i];
}
else {
dp[i]=Math.max(dp[i-1]+arr[i],arr[i-1]+arr[i]);
if(dp[i]<arr[i]) {
dp[i]=arr[i];
}
}
}
long big=dp[0];
for(int i=0; i<n; i++) {
if(dp[i]>=big) {
big=dp[i];
}
}
System.out.println(big);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준-2225번/합분해 (java) (1) | 2024.02.20 |
---|---|
백준-1699번/제곱수의 합 (java) (0) | 2024.02.19 |
백준-11053번/가장 긴 증가하는 부분 수열 (java) (0) | 2024.02.18 |
백준-2193번/이친수 (java) (1) | 2024.02.14 |
백준-10844번/쉬운 계단 수 (java) (2) | 2024.02.13 |