우당탕탕 개발자 되기
백준_가장 큰 증가 부분수열(11055) In Java 본문
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 를 출력한다.
'자료구조&알고리즘' 카테고리의 다른 글
| 백준_나이트의 이동(7562) in Java (0) | 2021.08.08 |
|---|---|
| 백준_전깃줄(2565) In Java (0) | 2021.08.02 |
| 백준_가장 긴 증가하는 부분 수열(11053) In Java (0) | 2021.08.02 |
| 백준_연속합(1912) In Java (0) | 2021.07.31 |
| 백준_회의실 배정(1931) In Java (0) | 2021.07.30 |