πŸ•οΈ ICPC Sinchon/Dynamic Programming

[BOJ][C++] λ°±μ€€ 8394번: μ•…μˆ˜

선달 2024. 8. 14. 03:18
λ°˜μ‘ν˜•

νšŒμ˜κ°€ 끝났고, 이제 μ•…μˆ˜λ₯Ό ν•˜λŠ” μ‹œκ°„μ΄λ‹€. λͺ¨λ“  μ‚¬λžŒμ€ μ§μ‚¬κ°ν˜• νƒμž ν•˜λ‚˜μ˜ ν•œ 면에 μ•‰μ•„μžˆλ‹€.

자리λ₯Ό λ²—μ–΄λ‚˜μ§€ μ•Šκ³  μ•…μˆ˜λ₯Ό ν•˜λŠ” λ°©λ²•μ˜ μˆ˜λŠ” 총 λͺ‡ κ°€μ§€μΌκΉŒ?

각 μ‚¬λžŒλ“€μ€ μžμ‹ μ˜ μ™Όμͺ½μ΄λ‚˜ 였λ₯Έμͺ½μ— μžˆλŠ” μ‚¬λžŒλ“€κ³Ό μ•…μˆ˜λ₯Ό ν•  수 μžˆλ‹€. (μ•ˆ ν•  μˆ˜λ„ μžˆλ‹€)

μž…λ ₯

첫째 쀄에 νšŒμ˜μ— μ°Έμ„ν•œ μ‚¬λžŒμ˜ 수 n (1 ≤ n ≤ 10,000,000)이 주어진닀.

좜λ ₯

첫째 쀄에 μ•…μˆ˜λ₯Ό ν•˜λŠ” λ°©λ²•μ˜ 수λ₯Ό 좜λ ₯ν•œλ‹€. μˆ˜κ°€ 맀우 컀질 수 있기 λ•Œλ¬Έμ—, λ§ˆμ§€λ§‰ 자리만 좜λ ₯ν•œλ‹€.

 

풀이

iλͺ…μ˜ μ‚¬λžŒλ“€μ΄ μ•…μˆ˜ν•˜λŠ” 경우의 수 쀑

1. λ§ˆμ§€λ§‰ 두 μ‚¬λžŒμ΄ μ•…μˆ˜ν•˜λŠ” 경우의 수

2. λ§ˆμ§€λ§‰ 두 μ‚¬λžŒμ΄ μ•…μˆ˜ν•˜μ§€ μ•ŠλŠ” 경우의 수

라면,

 

i+1λͺ…μ˜ μ‚¬λžŒλ“€μ΄ μ•…μˆ˜ν•˜λŠ” 경우의 μˆ˜λŠ”

γ„±. 1번 && i번 μ‚¬λžŒκ³Ό i+1번 μ‚¬λžŒμ΄ μ•…μˆ˜ λͺ»ν•¨

γ„΄. 2번 &&  i번 μ‚¬λžŒκ³Ό i+1번 μ‚¬λžŒμ΄ μ•…μˆ˜ 함

γ„·. 2번 &&  i번 μ‚¬λžŒκ³Ό i+1번 μ‚¬λžŒμ΄ μ•…μˆ˜ μ•ˆν•¨

= γ„±+γ„΄+γ„· ν•©μœΌλ‘œ ꡬ해진닀

 

μ΄λ•Œ ㄴ은 1번이 되고 γ„±+ㄷ은 2번이 λœλ‹€.

 

μ½”λ“œμ—μ„œλŠ” pair 벑터 dp[i] = {1번, 2번}둜 두고 κ³„μ‚°ν•œλ‹€.

// 풀이 : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>

using namespace std;

typedef pair<int,int> ci;

const int INF = 10000001;
int main() {
    int n;
    cin >> n;
    
    vector<ci>dp(INF);
    dp[1] = {0,0};
    dp[2] = {1,1};
    for(int i=3; i<INF; i++) {
        ci before = dp[i-1];
        int yes = before.second % 10; // λ§ˆμ§€λ§‰ 두 μ‚¬λžŒμ΄ μ•…μˆ˜ 함
        int no = (before.first+before.second) % 10; // μ•…μˆ˜ μ•ˆν•¨
        dp[i] = {yes, no};
    }
    
    cout << (dp[n].first + dp[n].second)%10 << "\n";
    
    return 0;
}

 

 

 

λ°˜μ‘ν˜•