백준 4811 c++

magicdrill·2025년 3월 17일
0

백준 문제풀이

목록 보기
569/655

백준 4811 c++

#include <iostream>
#include <vector>

using namespace std;

void input_data(vector<int>& T);
void find_answer(vector<int>& T);
void find_answer2(vector<int>& T);
long long DFS(int W, int H, vector<vector<long long>>& DP);

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	vector<int> T;

	input_data(T);
	find_answer(T);
	find_answer2(T);

	return 0;
}

void input_data(vector<int> &T) {
	int test_case = 0;

	while (1) {
		cin >> test_case;
		if (test_case == 0) {
			break;
		}
		T.push_back(test_case);
	}

	return;
}

void find_answer(vector<int>& T) {
	int i, W, H;
	vector<vector<long long>> DP(31, vector<long long>(31, 0));

	for (i = 0; i < T.size(); i++) {
		W = T[i];
		cout << DFS(W, 0, DP) << "\n";
	}

	return;
}

void find_answer2(vector<int>& T) {
	vector<vector<long long>> dp(31, vector<long long>(31, 0));

	for (int h = 0; h <= 30; h++) {
		dp[0][h] = 1; 
	}

	for (int w = 1; w <= 30; w++) {
		for (int h = 0; h <= 30; h++) {
			if (w > 0 && h + 1 < 31) dp[w][h] += dp[w - 1][h + 1]; 
			if (h > 0) dp[w][h] += dp[w][h - 1];
		}
	}

	for (int i = 0; i < T.size(); i++) {
		int W = T[i];
		cout << dp[W][0] << "\n";
	}

	return;
}

long long DFS(int W, int H, vector<vector<long long>> &DP) {
	if (H == -1) {
		return 0;
	}
	if (W == 0) {
		return 1;
	}
	if (DP[W][H] != 0) { 
		return DP[W][H]; 
	}
	DP[W][H] = DFS(W - 1, H + 1, DP) + DFS(W, H - 1, DP);

	return DP[W][H];
}

0개의 댓글