728x90
반응형
https://www.acmicpc.net/problem/1010
1010번: 다리 놓기
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
www.acmicpc.net
#include <iostream>
using namespace std;
int main() {
int t, n, m;
cin >> t;
int dp[31][31] = {0, };
for(int i = 1; i <= 30; i++){
for(int j = 1; j <= 30; j++){
if(i == 1){
dp[i][j] = j;
}
else if(i == j){
dp[i][j] = 1;
}
else{
for(int k = i - 1; k < j; k++){
dp[i][j] += dp[i - 1][k];
}
}
}
}
for(int i = 0; i < t; i++){
cin >> n >> m;
cout << dp[n][m] << endl;
}
return 0;
}
서쪽의 사이트 수가 1인 경우 경우의 수는 동쪽 사이트 수와 같다. dp[i][j] = j
서쪽의 사이트 수와 동쪽의 사이트 수가 같은 경우, 경우의 수는 항상 1이다. dp[i][j] = 1
규칙을 찾아보면 다음과 같다. (행은 서쪽 사이트 수, 열은 동쪽 사이트 수)
1 | 2 | 3 | 4 | 5 | |
1 | 1 | 2 | 3 | 4 | 5 |
2 | 1 | 1+2 | 1+2+3 | 1+2+3+4 | |
3 | 1 | 1+(1+2) | 1+(1+2)+(1+2+3) | ||
4 | 1 | 1+1+(1+2) | |||
5 | 1 |
따라서 서쪽의 사이트 수가 1인 경우, 서쪽의 사이트 수와 동쪽의 사이트 수가 같은 경우를 제외하면
dp[i][j] += dp[i - 1][k]
728x90
반응형
'Algorithm > BAEKJOON' 카테고리의 다른 글
[BOJ] 10826번 피보나치 수 4 (C++) (0) | 2022.01.11 |
---|---|
[BOJ] 10757번 큰 수 A+B (C++) (0) | 2022.01.11 |
[BOJ] 9461번 파도반 수열 (C++) (0) | 2022.01.09 |
[BOJ] 1316번 그룹 단어 체커 (C++) (0) | 2022.01.08 |
[BOJ] 11723번 집합 (C++) (0) | 2022.01.06 |