๋ฐฑ์ค€_1010

๊น€์žฌ๋ นยท2025๋…„ 6์›” 12์ผ
0

์ฝ”ํ…Œ

๋ชฉ๋ก ๋ณด๊ธฐ
40/42

๐Ÿšจ์˜ค๋Š˜์˜ ํ•™์Šต๐Ÿšจ

๐ŸŽฏ ์กฐํ•ฉ + DP(BottomUp->๋ฐ˜๋ณต๋ฌธ)

๐Ÿ—๏ธ ๋™์ชฝ ์‚ฌ์ดํŠธ ์ค‘ ์„œ์ชฝ ์‚ฌ์ดํŠธ ๊ฐœ์ˆ˜๋งŒํผ ์„ ํƒ
๐Ÿ—๏ธ ๋‹ค๋ฆฌ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š์•„์•ผ ํ•จ -> ์„ ํƒํ•œ ์‚ฌ์ดํŠธ์˜ ์ˆœ์„œ ์ƒ๊ด€X
โ€ป ์กฐํ•ฉ(๋™์ชฝ์‚ฌ์ดํŠธC์„œ์ชฝ์‚ฌ์ดํŠธ) โ€ป

โญ๏ธํŒŒ์Šค์นผ์˜ ์‚ผ๊ฐํ˜•โญ๏ธ
โœ… ์กฐํ•ฉ์˜ ๋ฉ”๋ชจ์ œ์ด์…˜ ๋ฏธ๋ฆฌ ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ

nCr=nโˆ’1Crโˆ’1+nโˆ’1Cr{}_{n}C_{r} = {}_{n-1}C_{r-1} + {}_{n-1}C_{r}

๐Ÿ”ธBottomUp(๋ฐ˜๋ณต๋ฌธ-for)


import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int caseCnt = Integer.parseInt(br.readLine());
        
        long[][] dp = new long[31][31]; // ์ตœ๋Œ€ 30C30๊นŒ์ง€ ๊ณ„์‚ฐ ๊ฐ€๋Šฅ

        // ํŒŒ์Šค์นผ์˜ ์‚ผ๊ฐํ˜• ์ดˆ๊ธฐํ™”
        for (int n = 0; n <= 30; n++) {
            dp[n][0] = 1;
            dp[n][n] = 1;

            for (int r = 1; r < n; r++) {
                dp[n][r] = dp[n - 1][r - 1] + dp[n - 1][r];
            }
        }
        
        //BottomUp
        for (int i = 0; i < caseCnt; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int west = Integer.parseInt(st.nextToken());
            int east = Integer.parseInt(st.nextToken());

            System.out.println(dp[east][west]);
        }
    }
}

๐Ÿ”ธTopDown(DP+DFS)

 static long[][] dp = new long[31][31];
    static long[] resultArr;

    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int caseCnt = Integer.parseInt(st.nextToken());

        resultArr = new long[caseCnt];

        for (int x = 0; x < 30; x++) {
            Arrays.fill(dp[x], -1L);
        }

        for(int i=0; i<caseCnt; i++){
            st= new StringTokenizer(br.readLine());

            int westCnt=  Integer.parseInt(st.nextToken());
            int eastCnt = Integer.parseInt(st.nextToken());

            resultArr[i] = dfs(westCnt,eastCnt);

        }

        for (long l : resultArr) {
            System.out.println(l);
        }


    }

    public static long dfs(int west,int east){
        if(west==0 || west==east){
            // ๋ฉ”๋ชจ์ œ์ด์…˜ ๊ธฐ๋ณธ๊ฐ’ ์ดˆ๊ธฐํ™”
            // ํŒŒ์Šค์นผ์˜ ์‚ผ๊ฐํ˜• ์ขŒ/์šฐ =1
            return dp[east][west] = 1;
        }

		
        // ๋ฉ”๋ชจ์ œ์ด์…˜ ๊ฐ’์ด ์žˆ๋‹ค != -1
        if(dp[east][west]!=-1){
            return dp[east][west];
        }

         
        // ํŒŒ์Šค์นผ์˜ ์‚ผ๊ฐํ˜• ๊ทœ์น™
        
        // ๋ฉ”๋ชจ์ œ์ด์…˜ ๊ฐ’์ด ์—†๋‹ค == -1
        // dfs ์žฌ๊ท€๋กœ ๋ฉ”๋ชจ์ œ์ด์…˜ ๊ฐ’์„ ์ฐพ์•„๊ฐ€๊ธฐ
        return dp[east][west] = dfs(east-1,west-1)+dfs(east-1,west);

    }

0๊ฐœ์˜ ๋Œ“๊ธ€