Source Code
/*
    # Enjoy the journey #
*/
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define forq(i , a , b) for (int i = (a); i <= (b); ++i)
#define qrof(i , b , a) for (int i = (a); i >= (b); --i)
#define forr(i , b) forq( i , 0 , b - 1 )
#define F first
#define S second
#define IF ->first
#define IS ->second
#define endl '\n'
#define qqmemset(array , val) memset (array , val , sizeof(array))
#define ALLV(vect) vect.begin() , vect.end()
#define mid (st + en) / 2
#define mid1 (2 * st + en) / 3
#define mid2 (2 * en + st) / 3
#define lef 2 * Node
#define rig lef + 1
mt19937 rng( chrono::steady_clock::now().time_since_epoch().count() );
#define Ran(a, b) rng() % ( (b) - (a) + 1 ) + (a)

ll R = 7 + 1e9 , R1 = 19491001 , R2 = 236 , NUMTESTCASE ;
const ll NN = 10 + 2e5 ;
const double pi = acos(-1.0) ;
int di [8] = {1 , 0 , -1 , 0  , 1 , -1 , 1  , -1 } , dj [8] = {0 , 1 , 0  , -1 , 1 , -1 , -1 , 1  } ;

int n , k [5] , x , Len , T [5] , Arr [NN] , Memo [NN][4][5][8] ;
int Dp (int x , int l1 , int l2 , int l3) {
    if (x > n) return 0 ;
    int &Res = Memo [x][l1][l2][l3] ;
    if (Res + 1)
        return Res ;
    Res = Dp (x + 1 , l1 , l2 , l3) ;
    int L [] = {0 , l1 , l2 , l3} ;
    forq (j , 1 , 3) {
        if (abs((Arr [x] % T [j]) - L [j]) > k [j])
            return Res ;
        L [j] = Arr [x] % T [j] ;
    }
    return Res = max(Res , 1 + Dp (x + 1 , L [1] , L [2] , L[3])) ;
}
int main()
{
    T [1] = 4 ;
    T [2] = 5 ;
    T [3] = 8 ;
    cin >> n ;
    forq (i , 1 , 3) scanf("%d" , k + i) ;
    forq (i , 1 , n) scanf("%d" , Arr + i) ;
    qqmemset(Memo , -1) ;
    int Ans = 0 ;
    forr (x , 4)
        forr (y , 5)
            forr (z , 8)
                Ans = max(Ans , Dp (1 , x , y , z)) ;

    cout << Ans ;
    return 0;
}
Copy
Band Song 2 Practice_Til_Red00
GNU G++17
1588 ms
151.6 MB
Time Limit Exceeded