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);

}