Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- Unreal Engine 5
- VR
- 수학
- 우선순위 큐
- 재귀
- 문자열
- 투 포인터
- 알고리즘
- 유니티
- 정렬
- ue5
- 스택
- BFS
- XR Interaction Toolkit
- 그리디 알고리즘
- Team Fortress 2
- 자료구조
- 백준
- 누적 합
- 다익스트라
- 그래프
- c++
- 백트래킹
- 트리
- DFS
- 다이나믹 프로그래밍
- 브루트포스
- 구현
- 유니온 파인드
- 시뮬레이션
Archives
- Today
- Total
1일1알
백준 2225번 합분해 C++ 본문

다이나믹 프로그래밍으로 해결할 수 있는 문제이다.
dp테이블을 dp[n][k]라고 하고, k개의 수로 n을 만들 수 있는 경우의 수 라고 하였다.
의외로 간단하게 해결할 수 있다.
예를 들어 dp[3][4]는 4개의 수로 3을 만들 수 있는 경우의 수인데,
마지막에 0이 온다면 3개의 수로 3를 만드는 경우의 수,
마지막에 1이 온다면 3개의 수로 2을 만드는 경우의 수,
마지막에 2가 온다면 3개의 수로 1를 만드는 경우의 수,
마지막에 3이 온다면 3개의 수로 0을 만드는 경우의 수 이다.
이 경우들을 모두 합하면 되기 때문에 점화식은 dp[n][k] = dp[n][k-1] + dp[n-1][k-1] + dp[n-2][k-1] + .... dp[0][k-1] 이다.
그리고 테이블을 채워가다 보면 dp[n-1][k-1] + dp[n-2][k-1] + .... dp[0][k-1] 은 dp[n-1][k]와 같다는 것을 알 수 있다.
그러므로 최종 점화식은 dp[n][k] = dp[n][k-1] + dp[n-1][k] 이다.
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
using namespace std;
typedef long long ll;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<vector<ll>> dp(201, vector<ll>(201, 1));
int n, k;
cin >> n >> k;
for (int i = 1; i < 201; i++) {
for (int j = 2; j < 201; j++) {
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
dp[i][j] %= 1000000000;
}
}
cout << dp[n][k] % 1000000000;
};
'알고리즘' 카테고리의 다른 글
백준 14891번 톱니바퀴 C++ (0) | 2022.01.06 |
---|---|
백준 16234번 인구 이동 C++ (0) | 2022.01.03 |
백준 3190번 뱀 C++ (0) | 2022.01.01 |
백준 15686번 치킨 배달 C++ (0) | 2021.12.31 |
백준 14503번 로봇 청소기 C++ (0) | 2021.12.30 |