代码之家  ›  专栏  ›  技术社区  ›  Wayne Werner

项目Euler 298-必须有正确的答案?(仅粘贴代码)

  •  2
  • Wayne Werner  · 技术社区  · 16 年前

    Project Euler 有一个分页文件问题(尽管它被伪装成了另一个词)。

    我测试过 my code (为了不破坏任何人的记忆)对照样本数据,得到与问题相同的记忆内容+分数。然而,几乎没有一个一致的分数分组。它要求50圈后的预期得分差异。随机抽样得分:

    1.50000000
    1.78000000
    1.64000000
    1.64000000
    1.80000000
    2.02000000
    2.06000000
    1.56000000
    1.66000000
    2.04000000
    

    我试过其中一些作为答案,但没有一个被接受…我知道 一些 人们成功了,所以我真的很困惑——我到底错过了什么?

    3 回复  |  直到 11 年前
        1
  •  2
  •   Aryabhatta    16 年前

    你的问题很可能是你似乎不知道 Expected Value .

    您必须多次运行模拟,并且对于每个分数差,保持出现的频率,然后采用加权平均值获得预期值。

    当然,考虑到这是工程欧拉问题,可能有一个数学公式可以很容易地使用。

        2
  •  2
  •   dgg32    16 年前

    是的,有一个正确的答案。老实说,蒙特卡洛可以在理论上接近于给定大数定律的期望值。但是,您不想在这里尝试。因为实际上每次运行simu时,结果都会略有不同,四舍五入到小数点后八位(我认为此设置确实剥夺了任何人使用蒙特卡洛的机会)。如果你幸运的话,你会有一个simu,它会在多次试验后给出答案,前提是你已经提交了所有以前的并且失败了。我认为,验证码是欧拉项目让你放弃任何暴力手段的第二种方式。

    好吧,同意白痴的观点,你必须先算出“期望值”。这个问题的原则是,你必须找到一种方法来列举每一个可能的“基本”结果后50轮。每一个结果都有它自己的L-R,所以总结一下,你就会得到答案。不用说,暴力方法在大多数情况下都失败了,特别是在这种情况下。幸运的是,我们有动态编程(dp),这很快!

    基本上,dp将每一轮的计算结果保存为状态,并在下一轮中使用它们。因此,它避免了反复重复相同的计算。这个问题的难点在于找到一种表示状态的方法,也就是说,您希望如何保存临时结果。如果您已经在dp中解决了问题290,那么您可以在那里获得一些关于如何理解问题和制定状态的提示。

    事实上,这并不是大脑中最困难的部分。最困难的是你是否意识到两个玩家的记忆状态在数字上是不同的,但实质上是相等的。例如,L:12345 R:12345与L:23456 R:23456或甚至L:98765 R:98765。这是因为通话是随机的。这也是我写可能的“基本”结果的原因。也就是说,可以将一些状态总结为一个状态。只有这样,你的计划才能在合理的时间内完成。

        3
  •  0
  •   µBio    16 年前

    我会运行你的模拟很多次,然后做一个加权平均 | L- R | 所有跑步的价值。这会使你更接近预期值。

    只提交一次运行作为答案是不太可能的。假设它是掷骰子的期望值。掷骰子,得分6,按预期值提交。

    推荐文章