정답률 26퍼센트의 dp 문제이다.
연속으로 된 몇 개의 수중 가장 합이 큰 값을 구하는 문제이다.
점화식을 구하는 방법을 보면
dp [i]에 올 수 있는 값은
dp[i-1]+값[i]이다.
하지만 값들 중에서 음수가 있기 때문에
dp[i-1]+값[i] 보다 그냥 값[i]가 더 클 수가 있다.
그래서 dp[i] = Math.max(dp[i-1]+값[i], 값[i]);로 점화식을 짤 수 있다.
dp[i]엔 연속된 합들이 들어가게 된다. 현재 값과 전에 값을 더했는데 현재 값 보다 작은 경우엔
dp[i]에 그냥 원래 값이 들어간다.
이렇게 구한 dp배열 중 최대 값을 출력하면 된다.
코드는 몇 줄 안되는데 생각하기가 참 어려운 문제이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int [] a = new int[n];
int [] dp = new int[n];
for(int i=0; i<n; i++)
a[i] = scan.nextInt();
dp[0] = a[0];
for(int i=1; i<n; i++)
System.out.println(dp[n-1]);
}
|
'Algorithm' 카테고리의 다른 글
백준 1699 제곱수의 합 Java (1) | 2019.04.15 |
---|---|
백준 2579 계단오르기 Java (0) | 2019.04.14 |
백준 11053 가장 긴 증가하는 부분 수열 Java (0) | 2019.04.12 |
백준 2156 포도주 시식 Java (0) | 2019.04.10 |
백준 9465 스티커 Java (0) | 2019.04.10 |