본문 바로가기

Algorithm/BAEKJOON

[BOJ] 1010번 다리 놓기 (C++)

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