正确的代码,但错误的ans :(

时间:2013-01-17 08:24:26

标签: python

我在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

谁能告诉我哪里弄错了?

1 个答案:

答案 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,您将获得许多有用的资源来查看:)