CCCPaste

Untitled

#include 
#include 
#include 
#include 
using namespace std;
int n;
int arr[2002];
vector > g[2005];
int memo[2000][5000];
int dp (int at, int prev_num){
    if(at == n){
        return 0;
    }
    if(memo[at][prev_num] != -1){
        return memo[at][prev_num];
    }
    int res = 2e9;
    for (int i= 0; i < g[at].size() ; i++) {
        if(g[at][i].first >= prev_num){
            res = min(res,dp(at+1,g[at][i].first) + g[at][i].second);
        }
    }
    return memo[at][prev_num] = res ;
}

int main() {
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> arr[i];
        for(int j = 0; j < (1 << 12); j++) {
            if(__builtin_popcount(j) == __builtin_popcount(arr[i])) {
                int p = (j ^ arr[i]);
                g[i].push_back(make_pair(j, __builtin_popcount(p) / 2));
            }
        }
    }
    memset(memo,-1,sizeof memo);
    int res = dp(0,0);
  
    cout << res;
    return 0;
}