๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[๋ฐฑ์ค€] 11727๋ฒˆ: 2ร—n ํƒ€์ผ๋ง 2 - C++ ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„/๋ฐฑ์ค€

[๋ฐฑ์ค€] 11727๋ฒˆ: 2ร—n ํƒ€์ผ๋ง 2 - C++

.23 2021. 7. 13. 21:23
๋ฌธ์ œ

2ร—n ์ง์‚ฌ๊ฐํ˜•์„ 1ร—2, 2ร—1๊ณผ 2ร—2 ํƒ€์ผ๋กœ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ 2ร—17 ์ง์‚ฌ๊ฐํ˜•์„ ์ฑ„์šด ํ•œ๊ฐ€์ง€ ์˜ˆ์ด๋‹ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— n์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค n โ‰ค 1,000)

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— 2ร—n ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜•์„ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ 10,007๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 


DP๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘ธ๋Š” ๋ฌธ์ œ.

์•ž์„œ ํ’€์—ˆ๋˜ 11726๋ฒˆ์ธ 2xn ํƒ€์ผ๋ง์„ ์กฐ๊ธˆ๋งŒ ์‘์šฉํ•˜๋ฉด ๋ฐ”๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

2xn ๋ชจ์–‘ ์ง์‚ฌ๊ฐํ˜•์„ ์ฑ„์šธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

๊ฐ€๋กœ ํ•œ ์นธ์„ 1x2 ํƒ€์ผ๋กœ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ• ํ•œ ๊ฐ€์ง€, ๊ฐ€๋กœ ๋‘ ์นธ์„ 2x1 ํƒ€์ผ์„ ์œ„์•„๋ž˜๋กœ ์Œ“์•„ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ• ํ•˜๋‚˜, 2x2 ํƒ€์ผ๋กœ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ• ํ•˜๋‚˜์ธ ์ ์„ ๊ณ ๋ คํ•˜์—ฌ ์ ํ™”์‹์„ ์„ธ์šฐ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

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

 

์ด ๋ฌธ์ œ ์—ญ์‹œ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •๊ณผ ๋งค ์—ฐ์‚ฐ๋งˆ๋‹ค 10007์˜ ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์—๋งŒ ์œ ์˜ํ•˜์—ฌ ํ’€๋ฉด ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ œ๋Š” top-down ๋ฐฉ์‹์œผ๋กœ ํ’€์—ˆ๋‹ค.

 

์ฝ”๋“œ
#include <cstdio>
#include <vector>
#define MAX 1001

using namespace std;

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

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

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

    int result = (DP(num - 1) + 2 * DP(num - 2)) % 10007;
    memo[num] = result;
    return result;
}