On this page
article
Shortest Addition Chain
Sobre
Computa o menor numero de adicoes para construir
cada valor, comecando com 1 (e podendo salvar variaveis)
Retorna um par com a dp e o pai na arvore
A arvore eh tao que o taminho da raiz (1) ate x
contem os valores que devem ser criados para gerar x
A profundidade de x na arvore eh dp[x]
DP funciona para ateh 300, mas a arvore soh funciona
para ateh 148
recuperacao certa soh ateh 148 (erra para 149, 233, 298)
Link original: additionChain.cpp
Código
pair<vector<int>, vector<int>> addition_chain() {
int MAX = 301;
vector<int> dp(MAX), p(MAX);
for (int n = 2; n < MAX; n++) {
pair<int, int> val = {INF, -1};
for (int i = 1; i < n; i++) for (int j = i; j; j = p[j])
if (j == n-i) val = min(val, pair(dp[i]+1, i));
tie(dp[n], p[n]) = val;
if (n == 9) p[n] = 8;
if (n == 149 or n == 233) dp[n]--;
}
return {dp, p};
}