백준 11055 가장 큰 증가 부분 수열 (JAVA 자바 풀이)
📌 문제
수열 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의 합이 가장 큰 증가 부분 수열의 합을 출력한다.
💎 문제 분석
LIS가 되는 조건이 추가된 부분이다. lis 이면서 dp값이 더 커지는 경우, 두 가지 조건을 만족시킬 때 초기화를 시켜준다.
메서드를 별도로 만들기 위해 변수들을 Field로 올렸다.
💡 코드 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static int[] numbers;
private static int[] dp;
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bufferedReader.readLine());
dp = new int[1001];
numbers = new int[1001];
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for (int i = 1; i <= N; i++) {
int number = Integer.parseInt(stringTokenizer.nextToken());
numbers[i] = number;
dp[i] = number;
}
int sumMax = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j < i; j++) {
if (isLis(i, j) && isSumAsMax(i, j)) { // lis 이면서도 더했을 때 더 커야 되므로
dp[i] = dp[j] + numbers[i];
}
}
sumMax = Math.max(sumMax, dp[i]);
}
System.out.println(sumMax);
}
private static boolean isSumAsMax(int i, int j) {
return dp[i] < dp[j] + numbers[i];
}
private static boolean isLis(int i, int j) {
return numbers[i] > numbers[j];
}
}
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준 2565 전깃줄 (JAVA 자바 풀이) (0) | 2022.12.14 |
---|---|
백준 11054 가장 긴 바이토닉 부분 수열 (JAVA 자바 풀이) (0) | 2022.12.14 |
백준 11053 가장 긴 증가하는 부분 수열 (JAVA 자바 풀이) (0) | 2022.12.13 |
백준 2156 포도주 시식 (JAVA 자바 풀이) (0) | 2022.12.13 |
백준 10844 쉬운 계단 수 (JAVA 자바 풀이) (0) | 2022.12.12 |