View
유형: dp
문제: 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
풀이
길이가 30까지인 파스칼의 삼각형을 미리 계산해둔 후, 입력값의 크기만큼 해당 값을 더해주면 된다.
입력값에서 r, c는 인덱스 크기에 맞춰 -=1을 해줘야 한다. (인덱스는 0부터 시작하기에)
세로의 크기는 r-1이상 r+w미만, 가로의 크기는 c-1이상 c+width미만이다.
width의 크기는 첫번째 for문에서 한번씩 +=1을 해주면 된다.
#include "vector"
#include "iostream"
using namespace std;
using ll = long long;
int main(){
vector<vector<int>> pascal(30);
// init pascal
for(int i = 0; i < pascal.size(); i++){
for(int j = 0; j < i+1; j++) pascal[i].push_back(1);
}
// calc pascal
for(int i = 0; i < pascal.size(); i++){
for(int j = 0; j < pascal[i].size(); j++){
int idx = i-1, left = j-1, right = j;
// 조건에 맞다면 갱신
if(idx >= 0 && left >= 0 && right < pascal[idx].size()){
pascal[i][j] = pascal[idx][left] + pascal[idx][right];
}
}
}
// 삼각형 길이 입력
int r, c, w; cin >> r >> c >> w;
r--; c--;
int width = 0;
ll answer = 0;
// 계산
for(int i = r; i < r+w; i++){
width += 1;
for(int j = c; j < c+width; j++) {
answer += pascal[i][j];
}
}
cout << answer << endl;
return 0;
}
'백준 알고리즘' 카테고리의 다른 글
백준 2810번 - 컵홀더 (C++) (0) | 2021.09.27 |
---|---|
백준 1388번 - 바닥 장식 (C++) (0) | 2021.09.25 |
백준 11256번 - 사탕 (C++) (0) | 2021.09.24 |
백준 - 돌 게임 유형 (0) | 2021.09.20 |
백준 16173, 16174번 - 점프왕 쩰리 (C++) (0) | 2021.09.20 |
reply