https://www.acmicpc.net/problem/4811
1.의사코드
1. 알약을 1개꺼낸 경우 vs 반개꺼낸경우 계속 2분탐색이다.
2. 완탐? -> 2^30 -> 불가 -> dp?
3. 상태 : 큰알약갯수, 작은알약갯수 : 그때의 경우의수
4. 경우의수는 기저사례 -> return 1, 후 +하면 된다.
아래 그림과 같이 1이 리턴되고 거꾸로 타고오면서 그런 경우의 수가 모두 더해진다.
2. 전체코드
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[34][34];
//큰알약남은갯수, 반알약남은갯수 : 그상태일때, 경우의수
ll dfs(int a, int b) {
if (a==0 && b==0) return 1;
if (dp[a][b] != -1) return dp[a][b];
dp[a][b] = 0;
if (a > 0)
dp[a][b] += dfs(a - 1, b + 1);
if (b > 0)
dp[a][b] += dfs(a, b - 1);
return dp[a][b];
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
while (1) {
int tc;
cin >> tc;
if (tc == 0) break;
memset(dp, -1, sizeof(dp));
cout << dfs(tc,0)<<"\n";
}
return 0;
}
'Algorithm > dp' 카테고리의 다른 글
백준 1932 정수삼각형 c++ // 재귀dp, 1,2,3,4..n 개 입력받는법 (0) | 2024.05.08 |
---|---|
프로그래머스 주사위고르기 c++ // 빡구현, 완탐, dp, 이분탐색, 발상 아이디어 (0) | 2024.05.08 |
백준 1103 게임 c++ // 경우의수 dp, 사이클검사방법 (0) | 2024.04.30 |
백준 17070 파이프옮기기 1,2 c++ // 재귀dp (0) | 2024.04.29 |
백준 1149 RGB거리 c++ // 재귀dp, 추가정보 필요시 해결방법 (0) | 2024.04.28 |