반응형
[생각의 흐름]
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;
}
반응형
'알고리즘' 카테고리의 다른 글
[알고리즘 문제해결전략] ITES - 외계 신호 분석 (0) | 2023.04.30 |
---|---|
[알고리즘 문제해결전략] NUMB3RS - 두니발 박사의 탈옥 (0) | 2023.04.09 |
[알고리즘 문제해결전략] ASYMTILING - 비대칭 타일링 (0) | 2023.02.26 |
[알고리즘 문제해결전략] SNAIL - 달팽이 (0) | 2023.01.15 |
[알고리즘 문제해결전략] TRIPATHCNT - 삼각형 위의 최대 경로 수 세기 (0) | 2023.01.08 |