https://www.acmicpc.net/problem/11055
11055번: 가장 큰 증가하는 부분 수열
수열 A가 주어졌을 때, 그 수열의 증가하는 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가하는
www.acmicpc.net
아까 풀었던 가장 긴 증가 수열 문제 코드를 조금 바꾸면 풀리겠다 싶었다.
엇 처음에는 틀렸습니다가 나왔다..
단 하나 있는 예제의 출력값과 같게 나오기는 하는데 뭐가 문제였을까?
아..찾았다 뭐가 문제였나면
dp[j] + dp[i]로 해둔게 문제였다.
dp[i]에는 이미 이전에 갱신해둔 dp값이 들어가 있으므로 거기에 dp[j]를 더하면 의도와 다르게 된다
그게 아니라 j 원소까지의 수열 최대합에 i 원본값(nums 배열에 저장된 값)을 더해야 하는것!
If문 조건도 마찬가지
package week1;
import java.io.*;
import java.util.StringTokenizer;
public class MaxPartialSequence { //백준 11055번 가장 큰 증가 부분수열 문제
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()); //수열의 크기 입력받음
StringTokenizer st = new StringTokenizer(br.readLine()); //수열 입력받음
int[] nums = new int[N];
int[] dp = new int[N]; //N크기만큼의 Dp배열 생성, 여기에 각 수열값들 위치까지 올수있는 부분수열중 최대 합이 들어갈것임
int max = 0; //가장 큰 부분수열 합
for (int i = 0; i < N; i++) {
nums[i] = Integer.parseInt(st.nextToken());
dp[i] = nums[i]; //기본적으로 자기 자신 값이 들어간다(자기 자신 하나가 일단 원소니까 기본적으로 넣어줌)
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i] && dp[j] + nums[i] > dp[i]) { //여기도 nums[]로 안해놔서 틀렸었다
/*증가하는 수열이 되어야 하니까 일단 j 원소의 크기가 i보다 작은지부터 확인,
dp[j]의 값에 자기 자신의 dp값을 더하는게 원래 dp값보다 크다면 갱신 */
dp[i] = dp[j] + nums[i]; //dp[j] + dp[i] 로해서 값이 잘못나오고있었다
}
}
if(max < dp[i]) max = dp[i];
}
bw.write(Integer.toString(max));
bw.flush();
bw.close();
}
}
그런 실수를 했었는데 문제 예제랑 똑같이 나왔던게 어이없다 ㅋㅋㅋ운이 좋았던듯
무튼 앞으로도 dp문제 감을 차근차근 익혀가야겠다..~!
'알고리즘 > dp' 카테고리의 다른 글
[SWEA] Test샘플문제 - 1952번 수영장 문제 (dp풀이) (0) | 2023.05.05 |
---|---|
[백준알고리즘] dp - 2225번 합분해 문제 (0) | 2023.04.03 |
[백준알고리즘] dp - 9466번 스티커 문제 (0) | 2023.04.02 |
[백준알고리즘] dp - 11054번 바이토닉 부분 수열 문제 (0) | 2023.04.01 |
[백준알고리즘] dp - 11053번 가장 긴 증가하는 부분 수열 문제 (0) | 2023.03.30 |