memoization for recursive Longest Increase subsequence

时间:2012-12-08 21:11:06

标签: algorithm dynamic-programming memoization

我想出了一个简单的跟随递归解决方案,用于最长的子序列。 但是,你能帮助将memoization包含在这个递归解决方案中吗?

public int findLIS(int a[], int maxSoFar, int item, int count) {

        if(item == a.length) {
            return count;
        }
        int length1 = findLIS(a,maxSoFar, item+1, count);
        int length2 = 0;
        if(a[item] > maxSoFar) {

            length2 = findLIS(a, a[item], item+1, count + 1);
        }
        return Math.max(length1, length2);
}

PS:这不是一个家庭作业问题,更符合我的兴趣。

1 个答案:

答案 0 :(得分:3)

使用Map<Pair<Integer,Integer>,Integer>,并在方法的开头添加:

Integer cache = map.get(new Pair<Integer,Integer>(maxSoFar,item));
if (cache != null) return cache;

每次return任何事情 - 请务必将(maxSoFar,item)=returnValue写入地图。

这个想法是在表示你在计算中的位置的对之间进行映射 - 到为这个状态找到的最大值,以避免重新计算它。


似乎是java,因此您可以使用apache commons Pair作为Pair界面。