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

[BOJ][C++] λ°±μ€€ 2688번: 쀄어듀지 μ•Šμ•„

선달 2024. 9. 6. 05:59
λ°˜μ‘ν˜•

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

 

문제

μ–΄λ–€ μˆ«μžκ°€ 쀄어듀지 μ•ŠλŠ”λ‹€λŠ” 것은 κ·Έ 숫자의 각 자리 μˆ˜λ³΄λ‹€ κ·Έ μ™Όμͺ½ 자리 μˆ˜κ°€ μž‘κ±°λ‚˜ 같을 λ•Œ 이닀.

예λ₯Ό λ“€μ–΄, 1234λŠ” 쀄어듀지 μ•ŠλŠ”λ‹€. 

쀄어듀지 μ•ŠλŠ” 4자리 수λ₯Ό 예λ₯Ό λ“€μ–΄ 보면 0011, 1111, 1112, 1122, 2223이 μžˆλ‹€. 쀄어듀지 μ•ŠλŠ” 4μžλ¦¬μˆ˜λŠ” 총 715κ°œκ°€ μžˆλ‹€.

이 λ¬Έμ œμ—μ„œλŠ” 숫자의 μ•žμ— 0(leading zero)이 μžˆμ–΄λ„ λœλ‹€. 0000, 0001, 0002λŠ” μ˜¬λ°”λ₯Έ 쀄어듀지 μ•ŠλŠ” 4μžλ¦¬μˆ˜μ΄λ‹€.

n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 쀄어듀지 μ•ŠλŠ” n자리 수의 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 T(1 <= T <= 1,000)이 주어진닀. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” 숫자 ν•˜λ‚˜ n으둜 이루어져 μžˆλ‹€. (1 <= n <= 64)

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ ν•œ 쀄에 ν•˜λ‚˜μ”© 쀄어듀지 μ•ŠλŠ” n자리 수의 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이

dp[i][j] = 숫자j둜 λλ‚˜λŠ” i자리 숫자

 

μ›λž˜λŠ”

dp[i][j] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2] + ... dp[i-1][j];

μ΄λ ‡κ²Œ κ°€μ•Όν•˜μ§€λ§Œ

잘 보면 결ꡭ

dp[i][j-1] = dp[i-1][0] ~ dp[i-1][j-1] 의 ν•©;

이기 λ•Œλ¬Έμ— κ·Έλƒ₯

dp[i][j] = dp[i][j-1] + dp[i-1][j];

μ΄λ ‡κ²Œλ§Œ ν•΄μ€˜λ„ μΆ©λΆ„ν•˜λ‹€

 

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

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<vector<long long>>dp(64+1, vector<long long>(10));
    for(int i=0; i<=9; i++) {
        dp[1][i] = 1;
    }
    for(int i=1; i<=64; i++) {
        dp[i][0] = 1;
    }
    for(int i=2; i<=64; i++) {
        for(int j=1; j<=9; j++) {
            dp[i][j] = dp[i][j-1] + dp[i-1][j];
        }
    }

    int t, n;
    cin >> t;

    while(t--) {
        cin >> n;
        
        long long ans = 0;
        for(long long i : dp[n]) {
            ans += i;
        }
        
        cout << ans << "\n";
    }

    return 0;
}
λ°˜μ‘ν˜•