Submission #1052576

#TimeUsernameProblemLanguageResultExecution timeMemory
1052576cjoaDetecting Molecules (IOI16_molecules)C++17
46 / 100
206 ms65536 KiB
#include "molecules.h"

#include <bits/stdc++.h>

using namespace std;

int L, U;
vector<int> W;

//                  i
//      0  1  2  3
// W = [6, 8, 8, 7]

//const int MAXN = 10000;
//const int MAXU = 10000;

using VB = vector<bool>;
using VVB = vector<VB>;

VVB cached;
VVB memo;
VVB decision;
//pair<int,int> parent[MAXN+1][MAXN+2];


// dp(i, espacio) = true si es posible utilizar las moleculas i hasta la ultima
//                  y que el espacio_ocupado se encuentra en el rango de [L, U]

bool dp( int i, int espacio_ocupado ) {
   if (espacio_ocupado > U)
      return false;

   if (i == (int) W.size()) {
      // ya no hay mas moleculas que tomar
      if (L <= espacio_ocupado and espacio_ocupado <= U)
         return true;
      else
         return false;
   }

   if (cached[i][espacio_ocupado])
      return memo[i][espacio_ocupado];

   bool res = false;

   // incluir la molecula i
   if (dp(i + 1, espacio_ocupado + W[i])) {
      decision[i][espacio_ocupado] = true;
   //   parent[i][espacio_ocupado] = {i+1, espacio_ocupado + W[i]};
      res = true;
   }
   
   // excluir la molecula i
   if (!res) {
      if ( dp(i + 1, espacio_ocupado) ) {
         decision[i][espacio_ocupado] = false;
      //   parent[i][espacio_ocupado] = {i+1, espacio_ocupado};
         res = true;
      }
   }

   cached[i][espacio_ocupado] = true;
   memo[i][espacio_ocupado] = res;

   return res;
}







std::vector<int> find_subset(int l, int u, std::vector<int> w) {
   W = w;
   L = l;
   U = u;

   cached   = VVB(W.size()+1, VB(U+2, false));
   memo     = VVB(W.size()+1, VB(U+2, false));
   decision = VVB(W.size()+1, VB(U+2, false));

   bool can = dp(0, 0);
   if (!can)
      return {};

   vector<int> res;
   for (int i = 0, espacio_ocupado = 0; i < (int) W.size(); ) {
      if (decision[i][espacio_ocupado])
         res.push_back(i);

      int nuevo_i, nuevo_esp;

   //   tie(nuevo_i, nuevo_esp) = parent[i][espacio_ocupado];

      if (decision[i][espacio_ocupado]) {
         nuevo_esp = espacio_ocupado + W[i];
      }
      else {
         nuevo_esp = espacio_ocupado;
      }
      nuevo_i = i+1;

      i = nuevo_i;
      espacio_ocupado = nuevo_esp;
   }
   return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...