[c++] Longest Increasing Sequence (๋ฌธ์ œ ID : LIS, ๋‚œ์ด๋„ : ํ•˜) :: ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต 1๊ถŒ

https://www.algospot.com/judge/problem/read/LIS

๋ฌธ์ œ

์–ด๋–ค ์ •์ˆ˜ ์ˆ˜์—ด์—์„œ 0๊ฐœ ์ด์ƒ์˜ ์ˆซ์ž๋ฅผ ์ง€์šฐ๋ฉด ์ด ์ˆ˜์—ด์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด (subsequence) ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 10 7 4 9 ์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์—๋Š” 7 4 9, 10 4, 10 9 ๋“ฑ์ด ์žˆ๋‹ค. ๋‹จ, 10 4 7 ์€ ์›๋ž˜ ์ˆ˜์—ด์˜ ์ˆœ์„œ์™€ ๋‹ค๋ฅด๋ฏ€๋กœ 10 7 4 9 ์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ์•„๋‹ˆ๋‹ค.

์–ด๋–ค ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ์ˆœ์ฆ๊ฐ€ํ•  ๋•Œ ์ด ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (increasing subsequence) ๋ผ๊ณ  ํ•œ๋‹ค. ์ฃผ์–ด์ง„ ์ˆ˜์—ด์˜ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ฒƒ์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ.

์–ด๋–ค ์ˆ˜์—ด์˜ ๊ฐ ์ˆ˜๊ฐ€ ์ด์ „์˜ ์ˆ˜๋ณด๋‹ค ํด ๋•Œ, ์ด ์ˆ˜์—ด์„ ์ˆœ์ฆ๊ฐ€ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜ C (<= 50) ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ ์ค„์—๋Š” ์ˆ˜์—ด์— ํฌํ•จ๋œ ์›์†Œ์˜ ์ˆ˜ N (<= 500) ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„์— ์ˆ˜์—ด์ด N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ •์ˆ˜๋Š” 1 ์ด์ƒ 100,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋งˆ๋‹ค ํ•œ ์ค„์”ฉ, ์ฃผ์–ด์ง„ ์ˆ˜์—ด์˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ

3
4
1 2 3 4
8
5 4 3 2 1 6 7 8 
8
5 6 7 8 1 2 3 4

์˜ˆ์ œ ์ถœ๋ ฅ

4
4
4

์ƒ๊ฐ์˜ ํ๋ฆ„

  1. ์›๋ž˜ ์ˆ˜์—ด์—์„œ 1๊ฐœ ์—†์• ๊ธฐ, 2๊ฐœ ์—†์• ๊ธฐ, ... , n-1๊ฐœ ์—†์• ๊ธฐ๊นŒ์ง€ ๊ฐ€๋ฉด์„œ ์—†์•จ index์˜ ์กฐํ•ฉ์„ ๋ชจ๋‘ ๊ณ„์‚ฐํ•ด๋ณด๊ธฐ

    ์กฐํ•ฉ ๋งŒ๋“ค๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์‹ซ์Œ => ๋„ˆ๋ฌด ๋ณต์žกํ•จ..

  2. ์ฆ๊ฐ€ํ•˜๋Š” ์ตœ๋Œ€๊ตฌ๊ฐ„์ฐพ๊ธฐ

    ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด ์ค‘ ์›๋ž˜ ์ˆ˜์—ด์—์„œ ์—ฐ์†์ ์œผ๋กœ ํ• ๋‹น๋˜์–ด์žˆ๋Š” ๊ฒƒ๋“ค์„ ์กฐ์‚ฌํ•œ๋‹ค.

    ๊ฐ€์žฅ ํฐ ์—ฐ์† ๋ถ€๋ถ„์ˆ˜์—ด์„ ํƒํ•ด์„œ ์•ž ๋’ค๋กœ ๋” ์ž‘๊ณ  ํฐ ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ๊ณ„์‚ฐํ•œ๋‹ค.

    ๋ฐ˜๋ก€ ) ์—ฐ์†์ ์ด์ง€ ์•Š์•„๋„ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€๋ถ€๋ถ„์ˆ˜์—ด์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ

    => test case 4๋ฒˆ์งธ

  3. ๊ฐ index ์ดํ›„์—์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ €์žฅํ•ด๋‘๊ธฐ

    ์ดํ›„์— ๋‚˜์˜ฌ index์— ๊ด€๊ณ„์—†์ด ๊ฐ index ๋งˆ๋‹ค ์ตœ์„ ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ๋ถ€๋ถ„๊ตฌ์กฐ์ด๋ฏ€๋กœ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ '์™„์ „ํƒ์ƒ‰ + ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ' ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ 

  1. ๋ฐฐ์—ด ๋“ฑ ๊ฐ์ฒด์˜ size ํ•จ์ˆ˜๋ฅผ for์˜ ์กฐ๊ฑด์—์„œ ์“ฐ๋ฉด ๋‚ด๋ถ€์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ด์šฉํ•  ๋ชฉ์ ์ด ์•„๋‹ˆ๋ฉด for๋ฌธ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋กœ ๋ฏธ๋ฆฌ ๋ฐ›์•„๋‘๊ธฐ

    int tmp = arr.size();
    for(int i=0; i<tmp; i++) // for(int i=0; i<arr.size(); i++) ํ•˜์ง€๋ง๊ธฐ

์ฝ”๋“œ

#include <iostream>

using namespace std;
int N;
int arr[500];
int memorize[500];

int LIS(int index) {
    if (memorize[index] != -1)
        return memorize[index];
    else if (index == N - 1)
        return 1;
    int max = 1;
    for (int i = index + 1; i < N; i++) {
        if (arr[index] >= arr[i])
            continue;
        int tmp = LIS(i);
        if (max < 1 + tmp)
            max = 1 + tmp;
    }
    memorize[index] = max;
    return max;
}

int main() {
    int C;
    cin >> C;
    while (C--) {
        cin >> N;
        fill(memorize, memorize + sizeof(memorize) / sizeof(int), -1);
        for (int i = 0; i < N; i++) {
            cin >> arr[i];
        }
        int max = 0;
        for (int i = 0; i < N; i++) {
            int tmp = LIS(i);
            if (tmp > max)
                max = tmp;
        }
        cout << max << endl;
    }
}

test case (๋Œ“๊ธ€ ์ฐธ๊ณ , ์ง์ ‘ ๋งŒ๋“  ๊ฒƒ๋“ค)

6
4
1 2 3 4 
8
5 4 3 2 1 6 7 8 
8
5 6 7 8 1 2 3 4
8
1 5 2 6 3 0 4 7
3
1 1 1
7
9 1 3 7 5 6 20
4
4
4
5
1
5

๋งˆ์ง€๋ง‰ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ

  1. max๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๊ณ ๋ คํ•œ ๊ฒฝ์šฐ

    max ๊ธธ์ด๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋‹ค ๊ณ ๋ คํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

    ex_) 9 1 3 7 5 6 20 ์˜ ๊ฒฝ์šฐ ์—ฐ์†๋œ ์ˆ˜๋“ค ์ค‘ (1,3,7), (5,6,20) ๋‘ ๊ฐœ์˜ max ์ฆ๊ฐ€์ˆ˜์—ด์ด ๋‚˜์˜จ๋‹ค.

  2. ํ•œ index์— ๋Œ€ํ•ด์„œ๋งŒ ์กฐ์‚ฌํ–ˆ์„ ๊ฒฝ์šฐ

    ์™„์ „ ํƒ์ƒ‰์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๊ฒฝ์šฐ ์ฒ˜์Œ index์—์„œ ๋‚จ์€ n-1๊ฐœ๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ, ์ด ๋•Œ index๋ฅผ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ํƒ์ƒ‰ํ•ด์•ผํ•œ๋‹ค.

    ex_) 0๋ฒˆ์งธ ์›์†Œ์— ๋Œ€ํ•ด 1~n-1๋ฒˆ์งธ ์›์†Œ๋ฅผ ํƒ์ƒ‰ => 1๋ฒˆ์งธ ์›์†Œ์— ๋Œ€ํ•ด 2~n-1๋ฒˆ์งธ ์›์†Œ๋ฅผ ํƒ์ƒ‰

    ์—ฌ๊ธฐ์„œ 0๋ฒˆ์งธ ์›์†Œ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ตฌํ˜„ํ•˜๊ณ  ๋ชจ๋“  index๋ฅผ ๊ณ ๋ คํ•˜๋„๋ก ๋ฐ˜๋ณต๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์•ˆํ•ด์คฌ์„ ๊ฒฝ์šฐ ํ•ด๋‹น ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™๋˜์ง€ ์•Š๋Š”๋‹ค.

  3. ๋” ๋น ๋ฅธ ํ•ด๋ฒ•

์•ž์—์„œ๋ถ€ํ„ฐ ๋ฐฐ์—ด์— ๋„ฃ์œผ๋ฉด์„œ ์ฆ๊ฐ€์ˆ˜์—ด์ด ์•„๋‹ˆ๊ฒŒ ๋  ๋•Œ, ํ•ด๋‹น ์ˆ˜๊ฐ€ ์œ„์น˜ํ•ด์•ผํ•  ๊ณณ์— ์‚ฝ์ž…ํ•ด์คŒ

ํ•ด๋‹น ์ˆ˜๊ฐ€ ์œ„์น˜ํ•ด์•ผํ•  ๊ณณ์€ ์ด์ง„ํƒ์ƒ‰์œผ๋กœ ์ฐพ๊ธฐ

์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(nlgn)์ด๋‹ค.

n : ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์‹œํ–‰

1 : ์ฆ๊ฐ€์ˆ˜์—ด์ด ์ด์–ด์ง€๋Š” ์ง€ ํ™•์ธ

lgn : ์ด์ง„ํƒ์ƒ‰์œผ๋กœ ์‚ฝ์ž…ํ•  ์œ„์น˜ ์ฐพ๊ธฐ

์ฝ”๋“œ : https://jaimemin.tistory.com/317

๋ฐ˜์‘ํ˜•