본문 바로가기
알고리즘!/Dynamic Programming

11727: 2Xn 타일링 2

by soeayun 2023. 7. 29.

이 문제도 타일링 1문제와 같이 점화식만 찾으면 쉽게 풀 수 있다.

dp[i-2]에서와 dp[i-1]에서 각각 길이가 2개짜리와 1개짜리를 더했을때 나오는 경우의 수를 구하여 

점화식을 만들어보면

 dp[i]=dp[i-1]+dp[i-2]+dp[i-2]가 된다.

 

점화식을 풀 때 dp[1]부터 하나하나 해보면서 구하는 것도 좋지만

dp[i]일때부터 생각해서 일반적인 해의 풀이를 구하는 것이 이 문제에서는 점화식을 더 찾기 쉬운 경우이다.

i-1 덩어리와 i-2 덩어리가 있을 때 i짜리 덩어리를 만들기 위한 경우의 수를 구하면 된다.

 

#include <stdio.h>

int dp[1001];


  int main(void)
  {
   int n;
    scanf("%d",&n);
    dp[1]=1;
    dp[2]=3;
    dp[3]=dp[1]*dp[2]+dp[2]-1;
    
    for(int i=4;i<=1000;i++)
      {
        dp[i]=dp[i-2]*dp[2]+dp[i-1]-dp[i-2]; //2칸 남았을때 가능한 경우의 수 3개, 한칸 남았을때는 1개
        //근데 1개 남았을 때 겹치는 경우가 있음 dp[i-2]에서 세로가 한칸짜리 2개를 붙일 경우
        if(dp[i]>=10007)
          dp[i]%=10007;
      }
    printf("%d",dp[n]);
  }

'알고리즘! > Dynamic Programming' 카테고리의 다른 글

[C] 2748: 피보나치 수 2  (0) 2023.07.30
[C] 1149: RGB거리  (0) 2023.07.30
[C] 11726: 2Xn 타일링  (0) 2023.07.25
[C] 2156: 포도주 시식  (0) 2023.07.24
[C] 9461: 파도반 수열  (0) 2023.07.23