Submission
Status:
(xSSSSSSSSS)(xSSSS)(xSSSS)(SSSSSSSSSS)
Subtask/Task Score:
{0/20}{0/30}{0/30}{0/20}
Score: 0
User: theem1502
Problemset: กองไฟ
Language: cpp
Time: 0.001 second
Submitted On: 2026-02-22 11:58:04
#include <bits/stdc++.h>
using namespace std;
int num;
int dp[151][51][51][51][3][3];
vector<int> check(3);
int recursion(int currentx, vector<int> &check, int forbidden, int first) {
// cout << "curr " << currentx << " " << forbidden << "\n";
int sum = 0;
if (currentx == num) {
// cout << "no";
return 1;
}
if (currentx == num -1) {
for (int i = 0; i < 3; i ++) {
if (i == first || i == forbidden || check[i] <= 0) {
continue;
}
check[i]--;
sum += recursion(currentx+1, check, i, first);
check[i]++;
}
return sum;
}
if (dp[currentx][check[0]][check[1]][check[2]][forbidden][first] != 0) {
return dp[currentx][check[0]][check[1]][check[2]][forbidden][first];
}
/*
if (forbidden == 1) {
sum += recursion();
}
if (forbidden == 2) {
sum += recursion() + recursion();
}
if (forbidden == 3) {
sum += recursion() + recursion();
}
*/
if (currentx == 0) {
// cout << "yes";
for (int i = 0; i < 3; i++) {
if (forbidden == i || check[i] <= 0) {
continue;
}
check[i]--;
sum += recursion(currentx + 1, check, i, i);
check[i]++;
}
return dp[currentx][check[0]][check[1]][check[2]][forbidden][first] = sum;
}
for (int i = 0; i < 3; i++) {
if (forbidden == i || check[i] <= 0) {
continue;
}
check[i]--;
sum += recursion(currentx + 1, check, i, first);
check[i]++;
}
return dp[currentx][check[0]][check[1]][check[2]][forbidden][first] = sum;
}
int main() {
cin >> num >> check[0] >> check[1] >> check[2];
cout << recursion(0, check, -1,-1);
}