𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 9095번: 1, 2, 3 λ”ν•˜κΈ° - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 9095번: 1, 2, 3 λ”ν•˜κΈ° - C++

.23 2021. 7. 16. 17:03
문제

μ •μˆ˜ 4λ₯Ό 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” 방법은 총 7가지가 μžˆλ‹€. 합을 λ‚˜νƒ€λ‚Ό λ•ŒλŠ” 수λ₯Ό 1개 이상 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  • 1+1+1+1
  • 1+1+2
  • 1+2+1
  • 2+1+1
  • 2+2
  • 1+3
  • 3+1

μ •μˆ˜ n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, n을 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 Tκ°€ 주어진닀. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•œ μ€„λ‘œ 이루어져 있고, μ •μˆ˜ n이 주어진닀. n은 μ–‘μˆ˜μ΄λ©° 11보닀 μž‘λ‹€.

 

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€, n을 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μ˜ 수λ₯Ό 좜λ ₯ν•œλ‹€.

 


DPλ₯Ό μ΄μš©ν•˜μ—¬ ν‘ΈλŠ” 문제. μ•žμ„œ ν’€μ—ˆλ˜ 타일링 λ¬Έμ œλ“€κ³Ό λ™μΌν•˜κ²Œ μƒκ°ν•˜λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλ‹€.

1, 2, 3만으둜 숫자 n을 λ§Œλ“€κΈ° μœ„ν•œ 경우의 μˆ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

1. (n - 1)에 1을 λ”ν•˜λŠ” 경우

2. (n - 2)에 2λ₯Ό λ”ν•˜λŠ” 경우

3. (n - 3)에 3을 λ”ν•˜λŠ” 경우

D[n]은 n을 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μ˜ 수라고 ν•  λ•Œ, μœ„μ˜ μ„Έ 방법을 κ³ λ €ν•˜μ—¬ 점화식을 μ„Έμš°λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

D[n] = D[n - 1] + D[n - 2] + D[n - 3]

 

λ¬Έμ œλŠ” top-down λ°©μ‹μœΌλ‘œ ν’€μ—ˆλ‹€.

 

μ½”λ“œ
#include <cstdio>
#include <vector>
#define MAX 12

using namespace std;

vector<int> memo(MAX, 0);
int DP(int num);

int main(void) {
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        int num;
        scanf("%d", &num);
        printf("%d\n", DP(num));
    }
    return 0;
}

int DP(int num) {
    if(num == 0) return 1;
    if(num < 3) return num;
    if(memo[num] > 0) return memo[num];

    int result = (DP(num - 1) + DP(num - 2) + DP(num - 3));
    memo[num] = result;
    return result;
}
Comments