Search
Duplicate
📗

파스칼 삼각형

주차
문제번호
15489
언어
C++
티어
실버
유형
수학
DP
조합론
nj_Blog
nj_상태
이해도
100%
풀이
사람
이해도 2
13 more properties

문제접근

구하려는 위치가 메모이제이션이 되어 있으면 그대로 사용하고 메모이제이션이 되어있지 않으면 규칙에 맞게 재귀를 통해서 값을 구함

놓쳤던 부분

메모이제이션을 안 하고 각 위치를 계산할때마다 재귀가 돌아서 시간 초과
크기가 크지 않기 때문에 미리 값을 다 구해놓는 방법. 결국 같은 코드인데 내가 더 비효율적으로 풀었음
#include <iostream> #include <algorithm> using namespace std; int dp[31][31]; int r, c, w, ans; int main() { cin >> r >> c >> w; dp[1][1] = 1; for (int i = 1; i <= 30; i++) { for (int j = 1; j <= i; j++) { if (j == 1 || j == i) dp[i][j] = 1; else dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; } } for (int i = 0; i < w; i++) { for (int j = 0; j <= i; j++) { ans += dp[r + i][c + j]; } } cout << ans; }
C
복사

코드

2024 KB

0 ms

#include <iostream> #include <cstring> using namespace std; int dp[31][31]; int r, c, w; int pascal(int row, int col) { if (dp[row][col] != 0) return (dp[row][col]); if (col == 1 || col == row) { dp[row][col] = 1; return (dp[row][col]); } return (dp[row][col] = pascal(row - 1, col - 1) + pascal(row - 1, col)); } int main(void) { long long answer = 0; ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> r >> c >> w; memset(dp, 0, sizeof(dp)); for (int i = r; i < r + w; i++) for (int j = c; j <= c + i - r; j++) { if (dp[i][j] == 0) pascal(i, j); answer += dp[i][j]; } cout << answer; return (0); }
C++
복사