๐Ÿ” ๋ฌธ์ œ๋งํฌ

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


๐Ÿ“Œ ๋ฌธ์ œ ์š”์•ฝ

  • ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด: ์ฆ๊ฐ€ํ–ˆ๋‹ค๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ํ˜•ํƒœ์˜ ์ˆ˜์—ด
  • ์ˆ˜์—ด์—์„œ ๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ.
  • ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด(LIS)๊ณผ ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด(LDS)์„ ๊ฒฐํ•ฉํ•˜์—ฌ ํ•ด๊ฒฐ

๐Ÿ›  ํ’€์ด ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  1. dp1[i]: nums[i]๋ฅผ ๋งˆ์ง€๋ง‰ ์›์†Œ๋กœ ํ•˜๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS).
    • dp1[i] = max(dp1[i], dp1[j] + 1) (nums[i] > nums[j])
  2. dp2[i]: nums[i]๋ฅผ ์ฒซ ์›์†Œ๋กœ ํ•˜๋Š” ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œ ๋ถ€๋ถ„ ์ˆ˜์—ด (LDS).
    • dp2[i] = max(dp2[i], dp2[j] + 1) (nums[i] > nums[j])
  3. ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด ๊ณ„์‚ฐ
    • dp1[i] + dp2[i] - 1 (์ค‘์•™๊ฐ’ nums[i]๊ฐ€ ์ค‘๋ณต๋˜๋ฏ€๋กœ -1

๐Ÿ’ก ์ฝ”๋“œ

public class Baekjoon_11054 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int[] nums = new int[n];
        int[] dp1 = new int[n]; // LIS
        int[] dp2 = new int[n]; // LDS

        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }

        // 1. LIS (์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ)
        dp1[0] = 1;
        for (int i = 1; i < n; i++) {
            for (int j = i - 1; j >= 0; j--) {
                if (nums[i] > nums[j]) {
                    dp1[i] = Math.max(dp1[i], dp1[j] + 1);
                }
            }
        }

        // 1. LDS (์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ)
        dp2[n - 1] = 1;
        for (int i = n - 1; i >= 0; i--) {
            for (int j = i + 1; j < n; j++) {
                if (nums[i] > nums[j]) {
                    dp2[i] = Math.max(dp2[i], dp2[j] + 1);
                }
            }
        }

        // 3. ๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด ๊ธธ์ด ๊ณ„์‚ฐ
        int ans = 0;
        for (int i = 0; i < n; i++) {
            int cnt = dp1[i] + dp2[i];
            ans = Math.max(ans, cnt);
        }
        System.out.println(ans - 1); // ์ค‘์•™๊ฐ’์€ ๊ฒน์น˜๋ฏ€๋กœ -1
    }
}

๐Ÿ† ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

  • LIS (O(Nยฒ)) + LDS (O(Nยฒ) = O(Nยฒ)
  • N โ‰ค 1000์ด๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(1,000,000) 
5jeong