U E D R , A S I H C RSS

POLY/김태진

�리오미노/POLY

  • í�´ë¦¬ì˜¤ë¯¸ë…¸
  • 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;
}

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:58
Processing time 0.0049 sec