Algorithm/baekjoon

연속합 2

마닐라 2022. 2. 17. 13:36

📍 문제 설명

💡 접근

수를 제거하지 않는 최대합과 수를 한 번 제거하는 최대합을 표현하는 2차월 배열을 이용한다.

1. 수를 제거하지 않는 경우

이 경우에는 기존 연속합 문제와 동일하다.

2. 수를 제거하는 경우

이 경우에는 수를 제거 한 적이 있는지/없는지 판단하여 최댓값을 구한다.

수를 제거 한 적이 있으면 현재 인덱스의 숫자를 지우지 못하므로 dp[i-1][1] + arr[i]

수를 제거 한 적이 없으면 현재 인덱스의 숫자를 지울 수 있으므로 dp[i-1][0]

이 중의 최댓값이 dp[i][1]에 들어간다.

 

👩‍💻 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int n, m, answer;
    static int[][] board;
    static int[] arr;
    static int[][] dp;
    static boolean[][] visited;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};
    static ArrayList<String> list = new ArrayList<>();
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = kb.nextInt();
        arr = new int[n];
        for(int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }

        //dp[i][0] 는 i번째 인덱스에서 수를 제거하지 않는 경우의 최댓값
        //dp[i][1] 는 i번째 인덱스에서 수를 한 번 제거하는 경우의 최댓값
        dp = new int[n][2];
        dp[0][0] = dp[0][1] = arr[0];
        //n = 1인 경우를 위해서
        answer = arr[0];

        for(int i = 1; i < n; i++) {
            dp[i][0] = Math.max(dp[i-1][0] + arr[i], arr[i]);
            
            dp[i][1] = Math.max(dp[i-1][0], dp[i-1][1] + arr[i]);

            answer = Math.max(answer, Math.max(dp[i][0], dp[i][1]));
        }



    }

    private void solution() {
    }

}

'Algorithm > baekjoon' 카테고리의 다른 글

DFS와 BFS  (0) 2022.02.18
ABCDE  (0) 2022.02.17
가장 긴 바이토닉 부분 수열  (0) 2022.02.16
가장 큰 증가 부분수열  (0) 2022.02.16
포도주 시식  (0) 2022.02.16