Skip to content

Latest commit

Β 

History

History
93 lines (69 loc) Β· 2.17 KB

BOJ1562.md

File metadata and controls

93 lines (69 loc) Β· 2.17 KB

문제

κ³„λ‹¨μˆ˜

문제 원본

문제의 원본은 μ—¬κΈ°μ„œ ν™•μΈν•˜μ„Έμš”.

λΆ„λ₯˜

  • λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°
  • λΉ„νŠΈλ§ˆμŠ€ν‚Ή

풀이

λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ„ μ΄μš©ν•˜μ—¬ μ–΄λ–€ 수λ₯Ό μ‚¬μš©ν–ˆλŠ”μ§€ μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λŠ”μ§€ ν‘œν˜„ν•œλ‹€.
λΉ„νŠΈλ§ˆμŠ€ν‚ΉμœΌλ‘œ 0, 1, 2, 3, 4의 숫자λ₯Ό μ‚¬μš©ν–ˆλ‹€λ©΄ μ•„λž˜μ™€ 같이 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 1 1 1 1 1

0~9λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•œ μƒνƒœλŠ” 1111111111둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. 즉 μ΅œλŒ€κ°’μ€ 1023이 λœλ‹€.

dp[i][j][k]
	* i : i길이의 μˆ˜μ—μ„œ
	* j : j둜 λλ‚˜λ©΄μ„œ
	* k : k에 λ§ˆν‚Ήλœ μƒνƒœμ˜ μˆ«μžλ“€μ„ μ΄μš©ν•œ
	κ³„λ‹¨μˆ˜μ˜ 개수

라고 μ •μ˜ν• λ•Œ,

dp[i][j][k] += 1 (i = 1)
            += dp[i - 1][j - 1][k] (i != 1, 0 < j)
            += dp[i - 1][j + 1][k] (i != 1, j < 9)

점화식은 μœ„μ™€ 같이 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. μ—¬κΈ°μ„œ 1,000,000,000으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ ν•΄κ°€ λœλ‹€λŠ” 점을 κΈ°μ–΅ν•΄μ•Όν•œλ‹€.

#include <bits/stdc++.h>

#define MOD 1000000000
#define ALL_USED 0b1111111111

using namespace std;

long long dp[101][10][ALL_USED + 1];

long long solve(int n) {
    for (int i = 1; i < 10; i++) {
        dp[1][i][1 << i] = 1;
    }

    for (int i = 2; i <= n; i++) {
        for (int j = 0; j <= 9; j++) {
            for (int k = 0; k <= ALL_USED; k++) {
                int bit = k | (1 << j);

                if (0 < j) {
                    dp[i][j][bit] += dp[i - 1][j - 1][k];
                    dp[i][j][bit] %= MOD;
                }
                if (j < 9) {
                    dp[i][j][bit] += dp[i - 1][j + 1][k];
                    dp[i][j][bit] %= MOD;
                }
            }
        }
    }

    long long sum = 0;
    for (int i = 0; i < 10; i++) {
        sum += dp[n][i][ALL_USED];
        sum %= MOD;
    }

    return sum;
}

int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    
    int n;
    cin >> n;

    cout << solve(n) << "\n";

    return 0;
}