• 생각

octorbirth.tistory.com/243여기를 통해 이해하였다.

 

2 * N 직사각형이 주어질 때, 2×1과 2×2 타일로 채우는 방법의 수

[구현]

Dynamic Programming (DP) 이용.

▶ DP[i] = 2 * i 직사각형에서 방법의 수

3 ≤ i 일 때, DP[i]는 DP[I-1]에서 크기  『1』만큼 늘어났기에 

 을 놓는 경우입니다.

① DP[i-1]에서 2*1 크기의 을 놓는 경우입니다.

     ■ 영역은 작은 단계에서 부터 쌓여온것이기 때문에 어떤 형태든 신경쓰지 않습니다.

② DP[i-2]에서 2*2 크기의  1개 or 2*1 크기의 를 2개 놓는 경우입니다. 

    → DP[i-2] * 2 

▶ DP[i] = DP[i-1] + (DP[i-2] × 2)

※ 0 ≤ n ≤ 250이기 때문에 Java의 경우 BigInteger 이용.

※ 문제 조건상 i = 0일 때, DP[0] = 0도 정의

 

 

  • 코드

정답 코드 : 점화식으로 구현하였다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
	static StringBuilder sb;
	static BigInteger[] dp;

	public static void main(String[] args) throws Exception {
		SetData();
		System.out.println(sb);
	}

	private static void SetData() throws Exception {
        Scanner sc = new Scanner(System.in);
		
		dp = new BigInteger[251];
		sb = new StringBuilder();
		
        dp[0] = new BigInteger("1"); 
        dp[1] = new BigInteger("1");
        dp[2] = new BigInteger("3");
        for(int i=3; i<=250; i++) {
            dp[i] = dp[i-2].multiply(new BigInteger("2"));
            dp[i] = dp[i].add(dp[i-1]);
        }
        
        while(sc.hasNextInt()){
            int n = Integer.parseInt(sc.next());
            sb.append(dp[n] + "\n");
         }
	}
}

'algorithm' 카테고리의 다른 글

[JAVA] 백준 2294번 : 동전 2  (0) 2020.12.21
[JAVA] 백준 2981번 : 검문  (0) 2020.12.21
[JAVA] 백준 11058번 : 크리보드  (0) 2020.12.18
[JAVA] 백준 11047번 : 동전 0  (0) 2020.12.17
[JAVA] 백준 16120번 : PPAP  (0) 2020.12.17

+ Recent posts