[Java] 백준(Baekjoon) 1010. 다리 놓기
2024. 1. 23. 16:24ㆍAlgorithm/Dynamic Programming
풀이
0<N<=M<30
1) N=2, M=2
다리 2개 서로 겹쳐질수 없음
=> 1
2) N=1, M=5
다리 1개
=> 5
3) 13 29
다리 13개
1. N, M이 같을 때
DP[1][1] = 1, DP[2][2] = 1, ...
2. N = 1일때
DP[1][M] = M
3. N=2 일때
DP[2][3]= 3 = 2+1 = DP[2][2]+DP[1][2] = DP[2][2]+DP[1][2]
DP[2][4]= 6 = 3+2+1 = DP[2][2]+DP[1][2]+DP[1][3] = DP[2][3] + DP[1][3]
DP[2][5]= 10 = 4+3+2+1
...
DP[2][M] = DP[2][M-1]+(M-1)
4. N=3
DP[3][4] = 4 = 2+2 = DP[3][3]+DP[2][3]
DP[3][5] = 10 = 3+4+3 = DP[3][3]+DP[2][3]+DP[2][4] = DP[3][4] +DP[2][4]
DP[3][6] = 20 = 4+6+6+4
DP[3][7] = 35 = 5+8+9+8+5
...
DP[3][M] = DP[3][M-1]+(M-1)
5. N=4
DP[4][5] = 5
5. N = 13
DP[13][13] = 1
DP[13][14] = 14
=> DP[i][j]= DP[i][j-1]+ DP[i-1][j-1];
package dp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Ex1010 {
static int dp[][] = new int[30][30];
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i=1;i<30;i++) {
for(int j=1;j<30;j++) {
if(i==j) dp[i][j]=1;
else if(i==1) dp[i][j]=j;
else {
dp[i][j]=dp[i][j-1]+dp[i-1][j-1];
}
}
}
int row = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int z=0;z<row;z++) {
String ex = br.readLine();
st = new StringTokenizer(ex);
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
System.out.println(dp[n][m]);
}
}
}
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[Java] 백준(Baekjoon) 11048. 이동하기 (1) | 2024.01.23 |
---|---|
[Java] 백준(Baekjoon) 9095. 1, 2, 3 더하기 (1) | 2024.01.23 |
동적계획법(Dynamic Programming, DP) (1) | 2024.01.22 |