PS/BOJ
[알고리즘] 백준 15489번: 파스칼 삼각형 (C++)
도비(Doby)
2021. 11. 27. 21:12
https://www.acmicpc.net/problem/15489
15489번: 파스칼 삼각형
첫째 줄에 양의 정수 R, C, W가 공백을 한 칸씩 두고 차례로 주어진다. (단, 2 ≤ R+W ≤ 30, 2 ≤ C+W ≤ 30, 1 ≤ W ≤ 29, C ≤ R)
www.acmicpc.net
파스칼 삼각형의 이항 계수의 특성상 r번째 행, c번째 열은 (r - 1)C(c - 1)과 같음을 이용하여 풀면 된다.
그리고, 이중 for문을 이용하여 변 w 길이를 만족하게끔 최종합에다가 (r - 1)C(c - 1)을 더해주면 된다.
[AC 코드]
#include <iostream>
#include <cmath>
#define MAX 30 + 1
using namespace std;
int cache[MAX][MAX];
int combi(int n, int r){
if(n == r || r == 0){
return 1;
}
else{
if(cache[n][r]){
return cache[n][r];
}
else{
return cache[n][r] = combi(n - 1, r - 1) + combi(n - 1, r);
}
}
}
int main(){
int r, c, w;
cin >> r >> c >> w;
int sum = 0;
int cnt = c - 1;
for(int i = r - 1; i < r - 1 + w; i++){
for(int j = c - 1; j <= cnt; j++){
//cout << i << ' ' << j << '\n';
sum += combi(i, j);
}
cnt++;
}
cout << sum;
return 0;
}