我在Python中解决Project Euler Problem #18。
我已成功解决了那里给出的样本问题,但未能解决主要问题。但代码是一样的。
代码是:
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
谁能告诉我哪里弄错了?
答案 0 :(得分:8)
抱歉,您使用的算法不正确 您正在使用的内容称为Greedy Algorithm,但使用的正确算法是Dynamic Programming。主要区别在于贪婪选择最佳当前选项作为选择,而动态编程枚举每个可能的选项并生成一系列选择。
有一个简单的案例,你的解决方案(贪婪)会失败:
0,
1, 0,
0, 0, 10
最好的结果是10,但你的算法会给出1。
暂时考虑一下,然后尝试寻找有关动态编程的信息。 项目欧拉是一个很棒的地方,当你想出一个解决方案时,它会感觉非常棒。所以我暂时不会说很多。 :)
更新:
但是问:从三角形的顶部开始,然后移动到下面一行的“相邻数字”。我根据这个词制作了我的代码。对不起打扰但是你能用这个词让我更清楚吗?
请注意,在给定的2^(n-1)
级三角形上实际存在n
个可能的路线。原始问题maximum total
表示所有这些路线中的最大总数
没有受让人认为您的代码会在ALL
路由中找到最大值,因为您在任何步骤中只选择TWO
个选项中更好的代码。
重新开始:
实际上在这个问题上,因为n=15
足够小,你也可以枚举所有2^(n-1)=16384
个可能的路线,总结每条路线的总价值,最后得到所有路线中的最大总数。但是,在Problem 67 of Project Euler中,问题大小n
增加到100,并且无法枚举所有2^(n-1)=633825300114114700748351602688
路由。
顺便说一句,我已经发布了一个动态编程维基页面的链接,但是我担心读作启动器会很复杂。对不起。
但不要担心,只有Google dynamic programming tutorial,您将获得许多有用的资源来查看:)