I am solving Project Euler Problem #18 in Python.
I have successfully solved the sample problem given there, but failed in solving the main problem. But the code is same.
Code is:
matrix = [('75', '0'),
('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')]
i = 0
j = 0
len = len(matrix )
sum = 0
for i in range(0,len):
if matrix [i][j] > matrix [i][j + 1]:
print matrix [i][j]
sum = sum + int(matrix [i][j])
else:
print matrix [i][j+1]
j = j + 1
sum = sum + int(matrix [i][j])
print sum
Can anyone tell me where I am mistaken?
Sorry but you’re using an incorrect algorithm.
What you’re using is called a Greedy Algorithm, but the correct algorithm to use is Dynamic Programming. The major difference is that greedy choose a best current option as a choice, while dynamic programming enumerates EVERY possible option and generate a series of choices.
There is a simple case on which your solution(greedy) would fail:
The best result is 10, but your algorithm would give 1 instead.
Think about it yourself for a moment, and then try seeking for information on Dynamic Programming.
Project Euler is a great place and it’s feels utterly great when you come up with a solution. So I won’t say many on it for now. 🙂
UPDATED:
Notice there would be actually
2^(n-1)possible routes on a givennlevel triangle. And in the original problemmaximum totalmeans the maximum total among all these routes.There’s no grantee that your code would find the maximum among
ALLroutes since you only choose a better one inTWOchoices at any step.AGAIN UPDATED:
Actually in this problem since
n=15is small enough, you can also enumerate all2^(n-1)=16384possible routes, summarize the total value of each route, and finally get a maximum total among all you get. However in Problem 67 of Project Euler the problem sizenis increased to 100 and it would be not possible to enumerate all2^(n-1)=633825300114114700748351602688routes.By the way, I’ve posted a link to wiki page of Dynamic Programming, but I’m afraid it’s to complex to read as a starter. Sorry for that.
But don’t worry, just Google dynamic programming tutorial and you’ll got many useful resources to see 🙂