algorithm/Dynamic Programming
[C++] BOJ 1010 다리 놓기
gartenhh
2021. 5. 1. 14:11
문제
백준 1010번 다리놓기
1010번: 다리 놓기
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
www.acmicpc.net
코드
#include<iostream>
using namespace std;
int dp[35][35];
int n, m, t;
int main(void){
for (int i = 0; i <= 30; i++){
dp[0][i] = dp[i][i] = 1;
}
for (int i = 1; i < 30; i++){
for (int j = 1; j <= (30 - i); j++){
dp[j][j + i] = dp[j][j + i - 1] + dp[j - 1][j + i - 1];
}
}
cin >> t;
while (t--){
cin >> n >> m;
cout << dp[n][m] << '\n';
}
}
풀이방법
각 경우의 수는 nCm과 같다. DP를 이용해 각 경우의 수를 모두 구해줬다.
고민과정
문제를 보자마자 조합계산법밖에 떠오르지 않았다. dp로 풀어야한다고 생각하다보니 조합의 규칙성이 뒤늦게 떠올랐다.
너무 오랜만에 풀었더니 출력할 때 줄을 바꿔야하는걸 잊어버려서 계속 틀렸다..