2225번: 합분해
첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
package baekjoon;
import java.util.*;
import java.io.*;
public class b2225 {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int dp[][] = new int[k+1][n+1];
for(int i = 1 ; i <= k ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
if(i == 1)
{
dp[i][j] = 1;
}
else if(j == 1)
{
dp[i][j] = i;
}
else
{
dp[i][j] = (dp[i-1][j] + dp[i][j-1])% 1000000000;
}
}
}
System.out.println(dp[k][n] );
}
}
처음에 생각할 때
이런 식으로 생각해서
재귀함수 쓰고 막 해야하나 했는데
dp인데? 싶어서 계속 생각하다가 구글링 해서 어떤 선생님이 하신대로 경우의 수를 표로 정리해봤는데
이렇게 되더라구요
그러면 dp[i][j] =dp[i-1][j] + dp[i][j-1] 이런 점화식을 갖게 되고
1행은 다 1이고
1열은 다 해당 행 크기만큼 갖게 돼서
for(int i = 1 ; i <= k ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
if(i == 1)
{
dp[i][j] = 1;
}
else if(j == 1)
{
dp[i][j] = i;
}
else
{
dp[i][j] = (dp[i-1][j] + dp[i][j-1])% 1000000000;
}
}
}
정리하면 이렇게 됨니다
깨달은 점...경우의 수 나열도 좋은데 경우의 수를 세서 표로 정리해보는 습관을 들여야겠다는 생각을 했습니다..
겐지충 프로그래머 :: 알고리즘 풀이 - 백준 2225(합분해, DP) (tistory.com)
알고리즘 풀이 - 백준 2225(합분해, DP)
관련글 Dynamic Programming 관련 포스팅은 여기를 참조 1. 개요 문제 링크는 여기를 참조 문제의 내용을 보려면 아래 더보기 클릭 더보기 이 문제는 N, K가 주어질 때, N까지의 정수 K개를 더해서 그 합
hongjw1938.tistory.com
이 선생님 글을 참고했습니다 감사합니다 선생님ㅠ ㅠ
'BOJ' 카테고리의 다른 글
[JAVA] 백준 1743번 - 음식물 피하기 (2) | 2023.07.03 |
---|---|
[JAVA] 백준 2447번 - 별 찍기 10 (1) | 2023.07.02 |
[JAVA] 백준 1669번 - 멍멍이 쓰다듬기 (1) | 2023.06.30 |
[JAVA] 백준 1593번 - 문자 해독 (2) | 2023.06.29 |
[JAVA] 백준 2293번 - 동전1 (2) | 2023.06.28 |
댓글