-
11055 : 가장 큰 증가 부분 수열Solve Algorithms/DP, BruteForce 2020. 4. 28. 16:56728x90
출처 : https://www.acmicpc.net/problem/11055
문제
수열 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의 합이 가장 큰 증가 부분 수열의 합을 출력한다.
접근
- dp에 초기값으로 list와 같은 값을 넣어준다.
- dp[i]에는 1부터 i번 중, 합이 가장 큰 증가 부분 수열의 합을 저장한다.
- 첫 번째 if문에서, 증가 부분 수열이므로, 현재 list[i]보다 작은 list[j]만을 대상으로 한다.
- 두 번째 if문에서, 현재 dp[i]가 이전의 dp[j]에 현재 list[i]를 더한 값보다 작으면, 현재 dp[i]를 갱신한다.
list 1 100 2 50 60 dp 초기값 1 100 2 50 60 dp 최종 1 100+1=101 2+1=3 50+3=53 60+53=113
코드
package beak;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));int n = Integer.parseInt(br.readLine());int[] list = new int[n + 1];int[] dp = new int[n + 1];int max = 0;StringTokenizer st = new StringTokenizer(br.readLine(), " ");for (int i = 1; i <= n; i++) {list[i] = Integer.parseInt(st.nextToken());dp[i] = list[i];}for (int i = 1; i <= n; i++) {for (int j = 1; j < i; j++) {if (list[j] < list[i]) {if (dp[i] < dp[j] + list[i]) {dp[i] = dp[j] + list[i];}}}}for (int i = 1; i <= n; i++) {if (max < dp[i])max = dp[i];}}}728x90'Solve Algorithms > DP, BruteForce' 카테고리의 다른 글
1309 : 동물원 (0) 2020.05.05 11054 : 가장 긴 바이토닉 부분 수열 (0) 2020.04.30 1699 : 제곱수의 합 (0) 2020.04.28 11053 : 가장 긴 증가하는 부분 수열 (0) 2020.04.24 10844 : 쉬운 계단 수 (0) 2020.04.22