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

 

11727번: 2×n 타일링 2

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.

www.acmicpc.net

JW 

 

#include "bits/stdc++.h"
using namespace std;
// 2*n 타일링 2
int dp[1001];
int recursive(int n) {
    if (n == 1) return 1;
    if (n == 2) return 3;
    if (dp[n] != 0) {
        return dp[n];
    }
    dp[n] = recursive(n-1)%10007 + 2*recursive(n-2)%10007;
    return dp[n];
}

int main() {
    int n;
    cin >> n;
    printf("%d", recursive(n)%10007);
}

 

 

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 숨바꼭질 4 (역추적)  (0) 2022.03.14
백준 일곱 난쟁이  (0) 2022.03.14
백준 꿀따기 21758번 (11점 )  (0) 2022.03.11
백준 균형잡힌 세상  (0) 2022.03.07
백준 소수 구하기 1929  (0) 2022.03.07

 

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

 

11727번: 2×n 타일링 2

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

www.acmicpc.net

전형적인 다이내믹 (동적계획법)문제다.

점화식은 아래 스케치를 참고하세요.^^

 

점화식 : K(n) = K(n-1) + 2*K(n-2)

 

 

<Top-Down - 재귀함수 사용 방법>

#include<bits/stdc++.h>
using namespace std;

int d[1001];

int tile(int n)
{
    if(n < 2) return 1;
    if(d[n] > 0) return d[n];
    
    d[n] = (tile(n-1) + tile(n-2) + tile(n-2))%10007;
    return d[n];
}
int main() {

    int n;
    scanf("%d",&n);

    printf("%d\n",tile(n));
    return 0;
}

 

<Bottom-Up>

#include<stdio.h>
int k[1004];
int main()
{
	int n,i,j;
	scanf("%d",&n);
	for(i=1; i<=1004; i++)k[i]=0;
	k[1]=1;
	k[2]=3;
	for(i=3; i<=n; i++){
        k[i]=k[i-1]+k[i-2]*2;
	}
	printf("%d",k[n]%10007);
	return 0;
}

 

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준-부등호 : 2529번  (0) 2020.01.15
백준 - 숨바꼭질 : 1697번  (0) 2020.01.11
백준 - 최소,최대 : 10818번  (0) 2020.01.02
백준 - 동전 0 : 11047번  (0) 2020.01.02
백준-N-Queen : 3344번  (0) 2019.12.26

+ Recent posts