본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 8895 막대배치

by 까망 하르방 2021. 2. 26.
반응형

출처: https://www.acmicpc.net/problem/8895

 Input 

4

4 1 2

4 1 1

5 2 4

20 2 1

 

 Output 

2

0

4

6402373705728000

[BOJ] 1328 고층빌딩와 동일한 문제로 해당 풀이 참조

 

[BOJ] 백준 1328 고층빌딩

출처: https://www.acmicpc.net/problem/1328  Input 3 2 2  Output 2 N개의 빌딩을 재배열하는 경우의 수는 O(N!)이며, 좌우에서 보여지는 빌딩의 개수를 구한다면 O(N × N!)으로 TLE 발생. DP[i][L][R] = i..

zoosso.tistory.com

 

▶ 동적계획법(Dynamic Programming, DP) 

 

동적계획법(Dynamic Programming, DP)

동적 계획법(Dynamic Programming)은 큰 의미에서 분할 정복과 같은 접근 방식을 의미한다. 처음 주어진 문제를 더 작은 문제들로 나눈 뒤 각 조각의 답을 계산하고, 이 답들로부터 원래 문제에 대한

zoosso.tistory.com


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new   InputStreamReader(System.in));
        StringTokenizer st = null;
        int T = Integer.parseInt(br.readLine());
         
        while(T-- > 0) {
            st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int L = Integer.parseInt(st.nextToken());
            int R = Integer.parseInt(st.nextToken());
             
            long[][][] DP = new long[21][21][21];
            DP[1][1][1] = 1;
            for(int i=2; i<=N; i++){
                for(int j=1; j<=L; j++){
                    for(int k=1; k<=R; k++){
                        DP[i][j][k] += DP[i-1][j][k]*(i-2); 
                        DP[i][j][k] += DP[i-1][j-1][k]; 
                        DP[i][j][k] += DP[i-1][j][k-1]; 
                    }
                }
            }
         
            // 정답출력
            System.out.println(DP[N][L][R]);
        }
    }
}

 

반응형

댓글