프로그래밍 세계/Algorithm

[Algorithm] 폴리오미노

깡다구짱 2013. 12. 13. 01:28

#include <stdio.h>
#include <stdlib.h>

const int MOD = 10*1000*1000;
int cache[101][101];
int N = 12;
int count = 0; // 메모이제이션 적용 시, 성능을 확인하기 위한 cnt

 

// - poly(int n, int first)함수의 기능 -

//   -> n개의 정사각형으로 이루어졌고, 맨 위 가로줄에 first개의

//       정사각형을 포함하는 폴리오미노의 수를 반환함

int poly(int n, int first){
 if(n == first) return 1;
 
 int& ret = cache[n][first];
 if (ret != -1) return ret;
 ret = 0;
 
 for(int second = 1 ; second <= n-first ; ++second){
  int add = second + first -1;
  int sum = poly(n-first, second);
  count++;
  
  // DSP 메모이제이션 상태 저장
  int temp = n - first;
  cache[temp][second] = sum;
  
  add = add * sum;
  add %= MOD;
    
  ret += add;
  ret %= MOD;
 }

  
 return ret;
}

int main()
{
 for(int i = 0 ; i < 101 ; i++)
  for(int j = 0 ; j < 101 ; j++)
   cache[i][j] = -1;
 
 int ret = 0;
 for(int i = 1 ; i <= N ; i++)
 {
  ret += poly(N, i);
  ret %= MOD;
 }
 
 printf("%d, cnt : %d", ret, count);
 
 system("pause");
 return 0;
}