๐Ÿ•๏ธ ICPC Sinchon/Dynamic Programming

[BOJ S2][C++] ๋ฐฑ์ค€ 11053๋ฒˆ: ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

์„ ๋‹ฌ 2022. 9. 28. 16:08
๋ฐ˜์‘ํ˜•

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

 

11053๋ฒˆ: ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 20, 10, 30, 20, 50} ์ด

www.acmicpc.net

 

๋ฌธ์ œ

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋Š” 4์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด A๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 1,000)

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int lis(int n, vector<int>&a) {
    vector<int>dp (n,1);  // dp[i] : a[i]๋กœ ๋๋‚˜๋Š” ๊ฐ€์žฅ ํฐ ์ˆ˜์—ด
    
    for(int i=0; i<n; i++){
        int tmpMax = 0;
        
        for(int j=0; j<i; j++) {
            if(a[j]<a[i] && tmpMax<dp[j])
                // ํ˜„์žฌ ์ˆ˜ a[i]๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋ฅผ ์ฐพ๊ณ  ํ•ด๋‹น ์ˆซ์ž๊ฐ€ ์ „๊นŒ์ง€์˜ ๋ฌธ์ž์—ด ๊ฐฏ์ˆ˜ dp[j] ์˜ ์ตœ๋Œ“๊ฐ’์ฐพ๊ธฐ
                tmpMax = dp[j];
        }
        
        dp[i] += tmpMax;
    }
    
    int maxDp = *max_element(dp.begin(), dp.end());
    
    return maxDp;
}

int main() {
    int n;
    cin >> n;
    vector<int> a(n, 0);
    for(int i=0; i<n; i++)
        cin >> a[i];
    
    cout << lis(n, a);
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•