Na implementação, escolheu-se a abordagem bottom-up, aplicando a seguinte ideia.
Observe esse triângulo de exemplo, formado pelas primeiras 4 linhas do triângulo proposto. Soma-se os adjacentes da camada inferior (bottom) com o número da camada de cima (up) e, dessa forma, os valores dos números da camada de cima são substituídos pelo maior valor dessas somas. Por exemplo, da camada inferior (bottom) temos os números 18 e 35, adjacentes do número 17 da camada de cima (up). A maior soma é dos números 35+17, assim o valor 52 é o que será armazenado. Ao final, a camada de cima (up) será atualizada e ficará com os seguintes valores.
Repetindo-se esse algoritmo, a segunda linha ficaria como abaixo, sendo o resultado final, ao ser efetuada a soma com a primeira linha, o valor 304.
Aplicando-se ao triângulo inteiro proposto, a implementação ficou assim:
$tri = @((75),(95,64),(17,47,82),(18,35,87,10),(20,04,82,47,65),(19,01,23,75,03,34),(88,02,77,73,07,63,67),(99,65,04,28,06,16,70,92),(41,41,26,56,83,40,80,70,33),(41,48,72,33,47,32,37,16,94,29),(53,71,44,65,25,43,91,52,97,51,14),(70,11,33,28,77,73,17,78,39,68,17,57),(91,71,52,38,17,14,91,43,58,50,27,29,48),(63,66,04,68,89,53,67,30,73,16,69,87,40,31),(04,62,98,27,23,09,70,98,73,93,38,53,60,04,23)) $bottom = @() $up = @() $max = 0 For ($li=(($tri.Length)-1); $li -gt 0; $li--) { $bottom = $tri[$li] $up = $tri[($li-1)] For ($i=1; $i -lt (($tri[$li].Length)-1); $i++) { If (($bottom[$i]+$up[$i]) -gt ($bottom[$i+1]+$up[$i])) { $up[$i] = ($bottom[$i]+$up[$i]) } Else { $up[$i] = ($bottom[$i+1]+$up[$i]) } } } If (($bottom[0]+$up[0]) -gt ($bottom[1]+$up[0])) { $max = ($bottom[0]+$up[0]) } Else { $max = ($bottom[1]+$up[0]) } Write-Host "Project Euler 18. Valor Máximo:"$max
Project Euler 18. Valor Máximo: 1074
Nenhum comentário:
Postar um comentário