保存结果的最佳方法 - 动态编程

时间:2012-01-19 19:20:22

标签: algorithm data-structures combinations dynamic-programming

我正在努力解决与Euler Problem 215有点类似的问题。我想我可以在不解释整个问题和/或解决问题的完整方法的情况下解释这一点。

现在我正在使用RT([Arraylist of numbers],int i)进行递归调用。根据这项技术,我想保存结果,所以如果RT要求同样的问题,我可以简单地查找答案而不是重复,直到达到基本情况。

只是为了说明RT([3,7.5,10.5,15],2)。在递归中,右侧增加右侧。 Arraylist用于识别需要召回的基本案例。

通常,我对动态编程的理解通常使用2D阵列,其中使用被称为参考点的结果进行保存和存储。如果它像RT(int x,int y)那样很好。但是我的问题呢?

我想我可以将ArrayList更改为字符串37510515,然后更改为某些使用过的ASCII数字或者数字本身。但是我希望我可以像HashMap那样使用ArrayList作为键来处理它,但是这个HashMap中的缺陷只适用于一个值(我知道我可以链接,但是如何在存储结果时工作)容易跟踪调用它的“int i”?)

简而言之,任何人都可以帮我想一个用ArrayList和int作为两个引用来存储结果的方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以使用任何类的对象作为HashMap的键,如果对象已正确定义了equals()和hashCode(),它将起作用。这些方法已在ArrayList中正确实现,因此您应该发现使用ArrayLists作为HashMap键非常有效。

如果你想使用一个ArrayList和一个组合作为HashMap的键的数字,你可以为此定义一个类,在该类中实现hashCode()和equals(),或者通过编号来欺骗一点只是arraylist中的最后一个条目。

听起来你正在做的事情比http://en.wikipedia.org/wiki/Memoization更像是动态编程,但它可能会完成工作 - 我想欧拉问题已被设置为使其能够用于最佳技术 - 如果是是记忆或动态编程你应该发现它是负担得起的。这需要太长时间,然后我们都错过了一些更有效的方法。

进一步加快速度的一种方法是利用问题中的对称性 - 例如如果你的状态对应于一行(或一列)的块,那么这与具有相同块的行具有相同的状态,从右到左而不是从左到右,或从下到上而不是从上到下。

答案 1 :(得分:0)

要解决的一种方法是实现自己的类,包括arraylist和amp; int,写这里提到的hashCodeequals

Using a byte array as Map key