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

[BOJ][C++] ๋ฐฑ์ค€ 2491๋ฒˆ: ์ˆ˜์—ด

์„ ๋‹ฌ 2023. 4. 17. 23:16
๋ฐ˜์‘ํ˜•

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

 

2491๋ฒˆ: ์ˆ˜์—ด

0์—์„œ๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ง„ N๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ๋‚˜์—ด๋œ ์ˆ˜์—ด์ด ์žˆ๋‹ค. ๊ทธ ์ˆ˜์—ด ์•ˆ์—์„œ ์—ฐ์†ํ•ด์„œ ์ปค์ง€๊ฑฐ๋‚˜(๊ฐ™์€ ๊ฒƒ ํฌํ•จ), ํ˜น์€ ์—ฐ์†ํ•ด์„œ ์ž‘์•„์ง€๋Š”(๊ฐ™์€ ๊ฒƒ ํฌํ•จ) ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธธ์ด๊ฐ€ ๊ธด ๊ฒƒ์„ ์ฐพ

www.acmicpc.net

 

๋ฌธ์ œ

0์—์„œ๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ง„ N๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ๋‚˜์—ด๋œ ์ˆ˜์—ด์ด ์žˆ๋‹ค. ๊ทธ ์ˆ˜์—ด ์•ˆ์—์„œ ์—ฐ์†ํ•ด์„œ ์ปค์ง€๊ฑฐ๋‚˜(๊ฐ™์€ ๊ฒƒ ํฌํ•จ), ํ˜น์€ ์—ฐ์†ํ•ด์„œ ์ž‘์•„์ง€๋Š”(๊ฐ™์€ ๊ฒƒ ํฌํ•จ) ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธธ์ด๊ฐ€ ๊ธด ๊ฒƒ์„ ์ฐพ์•„๋‚ด์–ด ๊ทธ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ. 

์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์—ด 1, 2, 2, 4, 4, 5, 7, 7, 2 ์˜ ๊ฒฝ์šฐ์—๋Š” 1 ≤ 2 ≤ 2 ≤ 4 ≤ 4 ≤ 5 ≤ 7 ≤ 7 ์ด ๊ฐ€์žฅ ๊ธด ๊ตฌ๊ฐ„์ด ๋˜๋ฏ€๋กœ ๊ทธ ๊ธธ์ด 8์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ˆ˜์—ด 4, 1, 3, 3, 2, 2, 9, 2, 3 ์˜ ๊ฒฝ์šฐ์—๋Š” 3 ≥ 3 ≥ 2 ≥ 2 ๊ฐ€ ๊ฐ€์žฅ ๊ธด ๊ตฌ๊ฐ„์ด ๋˜๋ฏ€๋กœ ๊ทธ ๊ธธ์ด 4๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋˜ 1, 5, 3, 6, 4, 7, 1, 3, 2, 9, 5 ์˜ ๊ฒฝ์šฐ์—๋Š” ์—ฐ์†ํ•ด์„œ ์ปค์ง€๊ฑฐ๋‚˜ ์ž‘์•„์ง€๋Š” ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ 3 ์ด์ƒ์ธ ๊ฒฝ์šฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ 2๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ์ˆ˜์—ด์˜ ๊ธธ์ด N์ด ์ฃผ์–ด์ง€๊ณ , ๋‘˜์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. N์€ 1 ์ด์ƒ 100,000 ์ดํ•˜์˜ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

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

 

ํ’€์ด

๋™์ ๊ณ„ํš๋ฒ•์„ ์ด์šฉํ•œ๋‹ค.

dp1[i] : i๋ฒˆ์งธ ์ˆซ์ž๊นŒ์ง€ ์—ฐ์†์ ์œผ๋กœ ๊ฐ™๊ฑฐ๋‚˜ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐฏ์ˆ˜

dp2[i] : i๋ฒˆ์งธ ์ˆซ์ž๊นŒ์ง€ ์—ฐ์†์ ์œผ๋กœ ๊ฐ™๊ฑฐ๋‚˜ ๊ฐ์†Œํ•˜๋Š” ๊ฐฏ์ˆ˜

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    // ์ž…๋ ฅ
    int n;
    cin >> n;
    vector<int> v(n);
    for(int i=0; i<n; i++)
        cin >> v[i];
    
    // ๋™์ ๊ณ„ํš๋ฒ•
    vector<int> dp1(n);
    vector<int> dp2(n);
    dp1[0] = dp2[0] = 1;
    for(int i=1; i<n; i++) {
        if(v[i-1] <= v[i]) dp1[i] = dp1[i-1]+1;
        else dp1[i] = 1;
        
        if(v[i-1] >= v[i]) dp2[i] = dp2[i-1]+1;
        else dp2[i] = 1;
        
    }
    
    //  ์ถœ๋ ฅ
    cout << max(*max_element(dp1.begin(), dp1.end()), *max_element(dp2.begin(), dp2.end()));
    
    return 0;
}
๋ฐ˜์‘ํ˜•