알고리즘
[알고리즘 문제해결전략] POLY - 폴리오미노
개발새발
2023. 4. 2. 22:41
반응형
[생각의 흐름]
1. 위에서 아래로 정사각형을 x개씩 채워나간다.
2. 직전 윗칸에서 채운(사용한) 사각형의 갯수와 현재 칸에 채우려는 사각형의 갯수를 알면 경우의 수를 구할 수 있다.
( 윗칸에서 채운 사각형의 수 + 현재 칸을 채우려는 사각형의 수 - 1)
3. 재귀함수를 통해 모든 경우의 수를 구한다.
4. 직전 윗칸에서 채운(사용한) 사각형의 갯수와 현재 사용할 수 있는 남은 사각형(leftBlock)의 갯수를 통해 메모이제이션이 가능하다.
/* https://www.algospot.com/judge/problem/read/POLY */
#include <stdio.h>
#include <memory.h>
const int MAX_BLOCK = 101;
const int MOD = 10000000;
int cache[MAX_BLOCK][MAX_BLOCK];
int n;
int sol(int leftBlock, int prevUsedBlock)
{
if (leftBlock == 0)
return 1;
int &ret = cache[prevUsedBlock][leftBlock];
if (ret != -1)
return ret;
ret = 0;
for (int usedBlock = 1; usedBlock <= leftBlock; usedBlock++)
{
int maxShift = prevUsedBlock + usedBlock - 1;
ret += sol(leftBlock - usedBlock, usedBlock) * maxShift;
ret %= MOD;
}
return ret;
}
int main(void)
{
int C;
scanf("%d", &C);
while (C--)
{
memset(cache, -1, sizeof(cache));
scanf("%d", &n);
int ret = 0;
for (int usedBlock = 1; usedBlock <= n; usedBlock++)
{
ret += sol(n - usedBlock, usedBlock);
ret %= MOD;
}
printf("%d\n", ret);
}
return 0;
}
반응형