Police investigation 3

È da un po’ di tempo che sto cercando di risolvere police 3, ho provato diversi approcci ma non riesco a pensare a un efficace risoluzione. Una cosa che non riesce a gestire il mio codice è quando incontra un valore con a sinistra uno più piccolo e a destra uno più grande, non avevo voglia di scrivere un altro if anche perchè penso che potrei scrivere un codice un po’ più semplice. Comunque questo è il risultato a cui sono arrivato, se sapete una strada migliore per favore illuminatemi.

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main(){
   
    ifstream in("input.txt");
    ofstream out("output.txt");
    
    long long N=0;
    long long amount=0;
    bool skipnext=0;
    in>>N;
    vector <int> t(N);
    vector <bool> skip(N);
    
    for(int i=0; i<N; i++){
       in>>t[i]; 
    }
    for(int i=0; i<N; i++){
        if(i==0){
            if(t[i]>=t[i+1]){
                skip[i]=1;
                skipnext=1;
                continue;
            }
        }else if(i==N-1){
            if(t[i]>=t[i-1] && skipnext==0){
                skip[i]=1;
            }
        }else{
            if(skipnext==0 && (t[i]>=t[i-1] && t[i]>=t[i+1])){
                skip[i]=1;
                skipnext=1;
                continue;
            }
        }
        skipnext=0;
    }
    
    for(int i=1; i<N; i++){
        if(skip[i-1]==1 && skip[i]==1){
            if(t[i-1]>=t[i]){
                skip[i]=0;
            }else if(t[i-1]<t[i]){
                skip[i-1]=0;
            }
        }
        
        //amount+=t[i];
    }
    for(int i=0; i<N; i++){
        if(skip[i]==0){
            amount+=t[i];
        }
        cout<<skip[i]<<" ";
    }
    
    out<<amount;
    return 0;
}

hint: se sei consideri tutti i semafori da un certo punto in poi, assumendo che puoi prendere il primo (aka che non hai preso quello prima di quelli che stai considerando), la soluzione ottima del sottoproblema e’ anche ottima nel problema originale
nome della tecnica molto generale per risolvere questo tipo di problemi: programmazione dinamica | dynamic programming
hint: se la soluzione per il sottoproblema rimane ottima e non dipende dalle scelte fatte prima, ti conviene salvartela cosi la puoi riusare se torni allo stesso punto con decisioni diverse
soluzione: f(x)=min(a[i+1]+f(x+2),a[i]+f(x+1)) (salvandoti f(x) per ogni x e ritornando 0 se x>=n, con a[n]=0, assuming che ho letto bene il testo)
f(0) sara’ la soluzione, puoi implementaro con una ricorsiva ma probabilmente fai prima con un iterativa