Deque, Prince and Princess
Autor(es):
// Jogada do Player 1:
max(
item[início] + Recursiva(inicio+1, fim, !flag),
item[fim] + Recursiva(inicio, fim-1, !flag)
)
// Jogada do Player 2:
min(
Recursiva(inicio+1, fim, !flag),
Recursiva(inicio, fim-1, !flag)
)
int brute(int ini, int fim, bool flag){
if(ini > fim){
return 0;
}
if(dp[ini][fim][flag] != -1)return dp[ini][fim][flag];
int chamada1 = brute(ini + 1, fim, !flag);
int chamada2 = brute(ini, fim - 1, !flag);
if(flag)return dp[ini][fim][flag] = max(v[ini] + chamada1, v[fim] + chamada2);
return dp[ini][fim][flag] = min(chamada1, chamada2);
}
Resultado final = Soma_Total - Resultado_Recursão
tam_sequencia1 = tam_sequecia2 = 250*250 = 62500
O(62500*62500)= 3.906.250.000 = 3*10⁹
No enunciado é informado que nas rotas de ambos, nenhuma posição se repete, sendo assim, podemos ordenar uma das sequências e fazer uma busca binária em relação às posições que ambas são iguais:
Seq_1 = 1 –> 7 –> 5 –> 4 –> 8 –> 3 –> 9, ordenando e salvando suas posições
relativas:
Seq_1 = (1,1) -> (3,6) -> (4,4) -> (5,3) -> (7,2) -> (8,5) -> (9,7)
Seq_1 = (1,1) -> (3,6) -> (4,4) -> (5,3) -> (7,2) -> (8,5) -> (9,7)
Seq_2 = 1 –> 4 –> 3 –> 5 –> 6 –> 2 –> 8 -> 9
Seq_nova = 1, 4, 6, 3, 5, 7
vector<ll>seq_1(p),seq_2(q),seq_3;
map<int,int>posicao_inicial;
cin >> seq_1 >> seq_2;
posicao_inicial[seq_1[i]] = i;
//Salva em posicao_inicial as posicoes de seq_1 antes da ordenação
sort(seq_1)
for(i=0;i<seq_2.size(),i++){
if(binary_search(seq_1.begin(),seq_1.end(),seq_2[i])
seq_3.push_back(posicao_inicial[seq_2[i]]);
}
cout << LIS(seq_3) << "\n";