Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

우당탕탕 개발자 되기

백준_가장 큰 증가 부분수열(11055) In Java 본문

자료구조&알고리즘

백준_가장 큰 증가 부분수열(11055) In Java

KimMINHun 2021. 8. 2. 16:40

https://www.acmicpc.net/problem/11055

 

11055번: 가장 큰 증가 부분 수열

수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수

www.acmicpc.net

이 문제는 백준 11053번 증가부분수열의 길이를 구하는 문제과 달리 부분 수열의 총합의 최대값을 구하는 것이다

 

LIS 문제 와 같이 풀지만 dp[]에 합을 입력하면 되는 문제이다. 

코드&설명

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] ar = new int[N];
        int[] dp = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < N; i++) {
            ar[i] = Integer.parseInt(st.nextToken());
        }
        int max=-1;
        for (int i = 0; i < N; i++) {
            dp[i] = ar[i];
            for (int j = 0; j <i ; j++) {
                if(ar[j]<ar[i]&&dp[i]<dp[j]+ar[i]){
                    dp[i] = dp[j] + ar[i];
                }
            }
            max = Math.max(dp[i], max);
        }
        System.out.println(max);
    }
}

비교를 할때 dp[i]=ar[i] 로 해주는 이유는 비교를 요소의 합으로 하기때문이다. 

max 값을 -1로 선언한 이유는 문제조건에서 1이상이라고 했기떄문에 음수로 주었다.

 

ar[i]<ar[j] 자기보다 작은 경우를 성립하고, dp[i]<dp[j]+ar[i] 값을 더했을때 그전에 값보다 커진다면

dp[i]=dp[j]+ar[i] 조건을 이용한다.

매 반복문이 끝날때마다 max 값 갱신해주고, max 를 출력한다.