- �리오미노
- DP를 ì�´ìš©í•œ ë¬¸ì œ.
- 가로줄ì�„ 층ì�´ë�¼ ì¹˜ê³ , X개로 만드는 것ì�˜ 경우는
- X-1ê°œ(ì œì�¼ 위층ì�„ ì œì™¸í•˜ê³ ) + ì œì�¼ 위층 1ê°œ , X-2ê°œ + 최ìƒ�층 2ê°œ, ... , 1ê°œ + 최ìƒ�층 X-1ê°œ, 최ìƒ�층 Xê°œ 로 쪼갤 수 있다.
- ì�´ë•Œ, ì œì�¼ 위층ì�„ ì œì™¸í•œ 것ì�˜ ì œì�¼ 위층ì�˜ 개수가 몇개ì�¸ì§€ 중요한ë�°, 최ìƒ�층 개수와 ë‘�번째층ì�˜ 개수ì—� ì�˜í•´ í�´ë¦¬ì˜¤ë¯¸ë…¸ë¥¼ 만족하는 경우ì�˜ 수가 세분화ë�˜ê¸° 때문ì�´ë‹¤.
- (예를들어 최ìƒ�층 3ê°œ, ë‘�번째층 2ê°œ(ê·¸ 아래층ì�€ ìƒ�관없ì�Œ)ì�¸ 경우는 " 최ìƒ�층 + ë‘�번째층 - 1 ", 즉 4ê°œì�˜ 경우가 ìƒ�ê¸°ê³ , ì�´ë¥¼ 곱해야한다.
- 여기까지 ì�´í•´ë¥¼ 했다면 ì§�ì ‘ DP ì �í™”ì‹�ì�„ ë§Œë“¤ì–´ë³´ê³ , ê·¸ë ‡ì§€ 않다면 코드를 ë³´ê³ ì�´í•´í•´ë³´ë ¤ê³ ë…¸ë ¥í•´ë³´ìž�. ì‹¤ì œë¡œ ìœ ì�˜ë¯¸í•œ 코드는 3번째 for문과 ì �í™”ì‹� 한줄, ì´� ë‘�줄 ë¿�ì�´ë�¼ëŠ” 것ì�„ 알게 ë� 것ì�´ë‹¤.
//
// main.cpp
// Algospot_normal
//
// Created by Jereneal Kim on 13. 8. 15..
// Copyright (c) 2013ë…„ Jereneal Kim. All rights reserved.
//
#include <iostream>
using namespace std;
int dp[101][101] = {0};
int main(int argc, const char * argv[])
{
int i,j,level,n,T;
dp[1][1]=1;
for(level=2;level<=100;level++){
for(i=1;i<level;i++){
for(j=1;j+i<=level;j++){
dp[level][i] %= 10000000;
dp[level][i] += (i+j-1)*dp[level-i][j];
}
}
dp[level][i]=1;
}
scanf("%d",&T);
for(int iter=0;iter<T;iter++){
scanf("%d",&n);
int sum=0;
for(i=1;i<=n;i++){
sum=(sum+dp[n][i])%10000000;
}
printf("%d\n",sum);
}
return 0;
}