Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

19-H0ngJu #202

Merged
merged 1 commit into from
Jun 3, 2024
Merged

19-H0ngJu #202

merged 1 commit into from
Jun 3, 2024

Conversation

H0ngJu
Copy link
Collaborator

@H0ngJu H0ngJu commented May 30, 2024

πŸ”— 문제 링크

ν•©λΆ„ν•΄

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

20λΆ„

✨ μˆ˜λ„ μ½”λ“œ

image

λ¬Έμ œμš”μ•½
0λΆ€ν„° NκΉŒμ§€μ˜ μ •μˆ˜ K개λ₯Ό λ”ν•΄μ„œ κ·Έ 합이 N이 λ˜λŠ” 경우의 수 λ°˜ν™˜ν•˜λΌ@! (단, 1+2와 2+1은 λ‹€λ₯Έ 경우둜 생각)

μ΄λ²ˆμ—” 행볡 μ½”λ”©.. ν–ˆμŠ΅λ‹ˆλ‹€

μ˜›λ‚ μ— ν’€μ—ˆλ˜ μ‰¬μš΄ 계단 μˆ˜μ™€ μœ μ‚¬ν•΄μš”!

κ·œμΉ™λ§Œ 찾으면 λλ‚˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€

κ·Έλƒ₯ K, N = 1λΆ€ν„° ν•˜λ‚˜μ”© ν‘œλ₯Ό 그리면

image

와 κ°™μ΄λ©λ‹ˆλ‹€.


즉,

μ–΄λ–€ 수 N을 K개의 수의 ν•©μœΌλ‘œ λ‚˜λˆ„λŠ” 경우의 μˆ˜λŠ”

N-1을 K개의 수의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” 경우의 수 + N을 K-1개의 수의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” 경우의 수

μž…λ‹ˆλ‹€.

λ”°λΌμ„œ κ³ λŒ€λ‘œ μ½”λ“œ μž‘μ„±ν•˜λ©΄ 끝!

import sys

def input(): return sys.stdin.readline().rstrip()
DIV = 1000000000

N, K = map(int, input().split())

dp = [[0] * (K+1) for _ in range(N+1)]
dp[0][0] = 1

for i in range(N+1):
    for j in range(1, K+1):
        dp[i][j] = dp[i-1][j] + dp[i][j-1]

print(dp[N][K] % DIV)

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

Copy link

@9kyo-hwang 9kyo-hwang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N개의 수 쀑 K개λ₯Ό μ„ νƒν•˜κΈ° -> μ‘°ν•©? λ°±νŠΈλž˜ν‚Ή κ°€μ¦ˆμ•„~
ν–ˆλŠ”λ° μ΅œλŒ€ (200, 200)μ΄λ‹ˆ DP둜 κ²°κ³Ό 캐싱해야겠넀~ ν•˜κ³  DP ν…Œμ΄λΈ” λšλ”± λ§Œλ“€μ—ˆλ„€μš” :)

#include <stdio.h>
#define MOD 1000000000

int N, K; 
int dp[201][201];

int backtracking(int n, int k) {
    if(n < 0) {
        return 0;
    } else if(k == 0) {
        return n == 0;
    } else if(dp[n][k] > 0) {
        return dp[n][k];
    } else {
        for(int i = 0; i <= N; ++i) {
            dp[n][k] += backtracking(n - i, k - 1);
            dp[n][k] %= MOD;
        }
        return dp[n][k];
    }
}

int main() {
    scanf("%d%d", &N, &K);
    printf("%d", backtracking(N, K));
    return 0;
}

image
ν™•μ‹€νžˆ Top-down 방식이 Bottom-up보닀 λŠλ¦¬λ„€μš” :(

Copy link
Member

@tgyuuAn tgyuuAn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와 DP 였랜만.....

import sys

def input(): return sys.stdin.readline().rstrip()

N, K = map(int, input().split())

DP = [[0 for _ in range(N+1)] for _ in range(K)]

for init in range(N+1):
    DP[0][init] = 1

for step in range(1,K):
    for plus_num in range(N+1):
        for now_num in range(N-plus_num+1):
            DP[step][now_num+plus_num] += DP[step-1][now_num]

print(DP[-1][-1]%1_000_000_000)

덕뢄에 ν–‰λ³΅μ½”λ”©ν–ˆμ”λ‹ˆλ‹€.................... λ°˜μ„±ν•©λ‹ˆλ‹€......

Copy link
Collaborator

@SeongHoonC SeongHoonC left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image

μ²˜μŒμ— 이전 ν–‰ 0~column κΉŒμ§€ 합을 κ³„μ‚°ν–ˆλŠ”λ° 이게 (row, column-1) μ΄λž‘ κ°™λ‹€λŠ”κ±Έ κΉ¨λ‹«κ³  μˆ˜μ •ν–ˆλ”λ‹ˆ μ‹œκ°„μ΄ 거의 절반컷..! μž¬λ°Œμ—ˆμŠ΅λ‹ˆλ‹Ή

코틀린은 μ˜€λ²„ν”Œλ‘œ λ•Œλ¬Έμ— Long νƒ€μž…μ΄λΌλ„ 맀번 λ‚˜λ¨Έμ§€ 계산을 ν•΄μ€˜μ•Όν•˜λ„€μš©

import java.io.BufferedReader
import java.io.InputStreamReader

private lateinit var br: BufferedReader

fun main() {
    br = BufferedReader(InputStreamReader(System.`in`))

    val (N, K) = br.readLine().split(" ").map { it.toInt() }
    val dp: Array<Array<Long>> = Array(K + 1) { row ->
        Array(N + 1) { if (row == 1) 1 else 0 }
    }

    for (row in 2..K) {
        dp[row][0] = dp[row - 1][0]
        for (column in 1..N) {
            dp[row][column] = (dp[row - 1][column] + dp[row][column - 1]) % 1_000_000_000L
        }
    }
    println(dp[K][N] % 1_000_000_000L)
}

@alstjr7437
Copy link
Member

점화식이 μ˜›λ‚  DP κΈ°λ³Έ λ¬Έμ œμ™€ λΉ„μŠ·ν•΄μ„œ λ°”λ‘œ λ– μ˜€λ₯Έ 문제 κ°™λ„€μš”!!!

λ”°λ‘œ ν™μ£Όλ‹˜ μ½”λ“œμ™€ μ™„μ „ λ˜‘κ°™ γ„·γ„·γ„·γ„·γ„·

n, k = map(int,input().split())
dp = [[0] * (k+1) for _ in range(n+1)]
dp[0][0] = 1

for i in range(0, n+1):
    for j in range(1, k+1):
            dp[i][j] = dp[i-1][j] + dp[i][j-1]

print(dp[n][k] % 1_000_000_000)

@H0ngJu H0ngJu merged commit a10a552 into main Jun 3, 2024
9 checks passed
@H0ngJu H0ngJu deleted the 19-H0ngJu branch June 3, 2024 04:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants