알고리즘&자료구조/문제

[BOJ] 4811 알약 C++

Nakuri 2023. 5. 15. 18:01
728x90

개요

https://www.acmicpc.net/problem/4811

 

4811번: 알약

입력은 최대 1000개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄이며, 병에 들어있는 약의 개수 N ≤ 30 가 주어진다. 입력의 마지막 줄에는 0이 하나 주어진다.

www.acmicpc.net

골드5 짜리 DP문제다.

풀이

W는 일반 알약, H가 반쪽짜리 알약이다.

2차원 배열의 형태로 생각을 해보았는데, 보면 반복적인 형태가 보인다.

W와 H가 공존할 때 경우의 수가 증가하는 규칙이 있다.

위 과정을 통해 점화식을 구했고 재귀(Top-Down)로 구현했다.

코드

#include<iostream>
#include<algorithm>
using namespace std;
long long dp[31][31];

long long GetCount(int w, int h)
{
	if(w<0 || h<0) return 0;
	if(dp[w][h]!=0) return dp[w][h];
	dp[w][h] = GetCount(w-1, h+1) + GetCount(w, h-1);
	return dp[w][h];
}
int main(){
	cin.tie(0)->sync_with_stdio(0);
	
	int N;
	for(int i=1; i<31; i++)
		dp[0][i] = 1;
	GetCount(30,0);

	while(true)
	{
		cin >> N;
		if(N==0) break;
		cout << dp[N][0] << "\n";
	}
}

'알고리즘&자료구조 > 문제' 카테고리의 다른 글

[BOJ] 16990 마법 장벽 C++  (0) 2023.05.24
[BOJ] 1149 RGB거리 C++  (0) 2023.05.15
[BOJ] 2302 극장 좌석 C++  (0) 2023.05.15
[BOJ] 9372 상근이의 여행 C++  (0) 2023.03.28
[BOJ] 1238 파티 C++  (0) 2023.03.07