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

[BOJ][C++] ๋ฐฑ์ค€ 1309๋ฒˆ: ๋™๋ฌผ์›

์„ ๋‹ฌ 2023. 11. 13. 17:12
๋ฐ˜์‘ํ˜•

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

 

1309๋ฒˆ: ๋™๋ฌผ์›

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

www.acmicpc.net

 

๋ฌธ์ œ

์–ด๋–ค ๋™๋ฌผ์›์— ๊ฐ€๋กœ๋กœ ๋‘์นธ ์„ธ๋กœ๋กœ N์นธ์ธ ์•„๋ž˜์™€ ๊ฐ™์€ ์šฐ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

์ด ๋™๋ฌผ์›์—๋Š” ์‚ฌ์ž๋“ค์ด ์‚ด๊ณ  ์žˆ๋Š”๋ฐ ์‚ฌ์ž๋“ค์„ ์šฐ๋ฆฌ์— ๊ฐ€๋‘˜ ๋•Œ, ๊ฐ€๋กœ๋กœ๋„ ์„ธ๋กœ๋กœ๋„ ๋ถ™์–ด ์žˆ๊ฒŒ ๋ฐฐ์น˜ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์ด ๋™๋ฌผ์› ์กฐ๋ จ์‚ฌ๋Š” ์‚ฌ์ž๋“ค์˜ ๋ฐฐ์น˜ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ๊ณจ๋จธ๋ฆฌ๋ฅผ ์•“๊ณ  ์žˆ๋‹ค.

๋™๋ฌผ์› ์กฐ๋ จ์‚ฌ์˜ ๋จธ๋ฆฌ๊ฐ€ ์•„ํ”„์ง€ ์•Š๋„๋ก ์šฐ๋ฆฌ๊ฐ€ 2*N ๋ฐฐ์—ด์— ์‚ฌ์ž๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐ€์ง€์ธ์ง€๋ฅผ ์•Œ์•„๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ์ฃผ๋„๋ก ํ•˜์ž. ์‚ฌ์ž๋ฅผ ํ•œ ๋งˆ๋ฆฌ๋„ ๋ฐฐ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ํ•˜๋‚˜์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ์นœ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

์ž…๋ ฅ

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

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์‚ฌ์ž๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ 9901๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ๋ผ.

 

ํ’€์ด

๋’ค๋กœ๊ตฌ๋ฅด๊ณ  ๋ฌผ๊ตฌ๋‚˜๋ฌด์„œ๊ธฐํ•˜๋ฉด์„œ ๋ด๋„ ๋™์ ๊ณ„ํš๋ฒ• ๋ฌธ์ œ

 

dp[i][j]= i๋ฒˆ์งธ ์นธ ๋‘๊ฐœ์— ์‚ฌ์ž๋ฅผ j ํ˜•ํƒœ๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜

j=0 -> ์™ผ์ชฝ 0๋งˆ๋ฆฌ ์˜ค๋ฅธ์ชฝ 0๋งˆ๋ฆฌ

j=1 -> ์™ผ์ชฝ 0๋งˆ๋ฆฌ ์˜ค๋ฅธ์ชฝ 1๋งˆ๋ฆฌ

j=2 -> ์™ผ์ชฝ 1๋งˆ๋ฆฌ ์˜ค๋ฅธ์ชฝ 0๋งˆ๋ฆฌ

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด

์ง์ „(๋ฐ”๋กœ ์œ„)์นธ์ด ์™ผ0 ์˜ค0 (j=0) -> ์ง€๊ธˆ์นธ์— ๋ชจ๋“  ํ˜•ํƒœ 3๊ฐ€์ง€ ๊ฐ€๋Šฅ

 

์ง์ „ ์นธ์ด ์™ผ0 ์˜ค1 (j=1)

์ง์ „ ์นธ | xo | xo | xo | xo

ํ˜„์žฌ ์นธ | xx | xo | ox | oo

4๋ฒˆ์งธ ๊ฒฝ์šฐ ์ค‘ ์™ผ0์˜ค0(j=0), ์˜ค1์™ผ0(j=2) ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ๋งŒ ๊ฐ€๋Šฅ

 

์ง์ „ ์นธ์ด ์™ผ1 ์˜ค0 (j=2)

์™ผ0์˜ค0(j=0), ์™ผ0์˜ค1(j=1) ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ๋งŒ ๊ฐ€๋Šฅ

 

์ด๋ ‡๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, 

dp[i][0] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]

dp[i][1] = dp[i-1][0] + dp[i-1][2]

dp[i][2] = dp[i-1][0] + dp[i-1][1]

์œผ๋กœ ์ ํ™”์‹์„ ์„ธ์šธ ์ˆ˜ ์žˆ๊ฒ ๋‹ค

 

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>

using namespace std;

const int INF = 9901;
int main() {
    int n;
    cin >> n;
    vector<vector<int>> dp(n+1, vector<int>(4));
    
    dp[1] = {1,1,1};
    for(int i=2; i<=n; i++) {
        dp[i][0] = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2])%INF;
        dp[i][1] = (dp[i-1][0] + dp[i-1][2])%INF;
        dp[i][2] = (dp[i-1][0] + dp[i-1][1])%INF;
    }
    
    cout << (dp[n][0] + dp[n][1] + dp[n][2])%INF;
    
    return 0;
}
๋ฐ˜์‘ํ˜•