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

[BOJ][C++] λ°±μ€€ 1904번: 01타일

선달 2024. 8. 25. 05:43
λ°˜μ‘ν˜•

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

 

문제

μ§€μ›μ΄μ—κ²Œ 2진 μˆ˜μ—΄μ„ κ°€λ₯΄μ³ μ£ΌκΈ° μœ„ν•΄, 지원이 μ•„λ²„μ§€λŠ” κ·Έμ—κ²Œ 타일듀을 μ„ λ¬Όν•΄μ£Όμ…¨λ‹€. 그리고 이 각각의 타일듀은 0 λ˜λŠ” 1이 μ“°μ—¬ μžˆλŠ” λ‚±μž₯의 타일듀이닀.

μ–΄λŠ λ‚  짓ꢂ은 동주가 μ§€μ›μ΄μ˜ 곡뢀λ₯Ό λ°©ν•΄ν•˜κΈ° μœ„ν•΄ 0이 쓰여진 λ‚±μž₯의 타일듀을 λΆ™μ—¬μ„œ ν•œ 쌍으둜 이루어진 00 타일듀을 λ§Œλ“€μ—ˆλ‹€. κ²°κ΅­ ν˜„μž¬ 1 ν•˜λ‚˜λ§ŒμœΌλ‘œ 이루어진 타일 λ˜λŠ” 0타일을 두 개 뢙인 ν•œ 쌍의 00νƒ€μΌλ“€λ§Œμ΄ λ‚¨κ²Œ λ˜μ—ˆλ‹€.

κ·ΈλŸ¬λ―€λ‘œ μ§€μ›μ΄λŠ” νƒ€μΌλ‘œ 더 이상 크기가 N인 λͺ¨λ“  2진 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μ—†κ²Œ λ˜μ—ˆλ‹€. 예λ₯Ό λ“€μ–΄, N=1일 λ•Œ 1만 λ§Œλ“€ 수 있고, N=2일 λ•ŒλŠ” 00, 11을 λ§Œλ“€ 수 μžˆλ‹€. (01, 10은 λ§Œλ“€ 수 μ—†κ²Œ λ˜μ—ˆλ‹€.) λ˜ν•œ N=4일 λ•ŒλŠ” 0011, 0000, 1001, 1100, 1111 λ“± 총 5개의 2진 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.

우리의 λͺ©ν‘œλŠ” N이 μ£Όμ–΄μ‘Œμ„ λ•Œ 지원이가 λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  κ°€μ§“μˆ˜λ₯Ό μ„ΈλŠ” 것이닀. 단 타일듀은 λ¬΄ν•œνžˆ λ§Žμ€ κ²ƒμœΌλ‘œ κ°€μ •ν•˜μž.

μž…λ ₯

첫 번째 쀄에 μžμ—°μˆ˜ N이 주어진닀. (1 ≤ N ≤ 1,000,000)

좜λ ₯

첫 번째 쀄에 지원이가 λ§Œλ“€ 수 μžˆλŠ” 길이가 N인 λͺ¨λ“  2진 μˆ˜μ—΄μ˜ 개수λ₯Ό 15746으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이

μ „ν˜•μ μΈ dp 문제

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

#include <iostream>
#include <vector>

using namespace std;

const int NUMBER = 15746;

int main() {
    int n;
    cin >> n;
    
    vector<int>dp(n+1);
    dp[1] = 1;
    dp[2] = 2;
    for(int i=3; i<=n; i++) {
        dp[i] = (dp[i-1] + dp[i-2])%NUMBER;
    }
    
    cout << dp[n];
    
    
    return 0;
}
λ°˜μ‘ν˜•