백준 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];
}