수열 A가 주어졌을 때, 그 수열의 증가하는 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가하는 부분 수열은 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 이고, 합은 113이다.
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
첫째 줄에 수열 A의 합이 가장 큰 증가하는 부분 수열의 합을 출력한다.
입력 | 출력 |
---|---|
10 | |
1 100 2 50 60 3 5 6 7 8 | 113 |
dp 배열을 돌면서
i 번째 전에 있는 가장 큰 증가하는 부분 수열에 i 번째 수열의 값을 더하면 됨
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class two11055 {
private int[] sequence;
private int[] dp;
public void solution() throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sequence = new int[n];
dp = new int[n];
for (int i = 0; i < n; i++) {
sequence[i] = sc.nextInt();
}
dp[0] = sequence[0];
for (int i = 1; i < n; i++) {
List<Integer> candidates = new ArrayList<>();
for (int j = 0; j < i; j++) {
if (sequence[j] < sequence[i]) {
candidates.add(j);
}
}
int maxValue = 0;
for (Integer candidate : candidates) {
maxValue = Math.max(maxValue, dp[candidate]);
}
dp[i] = maxValue + sequence[i];
}
int answer = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
answer = Math.max(answer, dp[i]);
}
System.out.println(answer);
}
public static void main(String[] args) throws IOException {
new two11055().solution();
}
}