我想出了一个简单的跟随递归解决方案,用于最长的子序列。 但是,你能帮助将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:这不是一个家庭作业问题,更符合我的兴趣。
答案 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
界面。