Question I need Help with: CHECK HERE
需要一些帮助解决这个问题。
到目前为止我提出的解决方案是:
将B视为输入并向后移动,因此取B的最后一个值并从后面查看A以找到与B匹配的内容。然后取B的第一个值并从前面查看A并找到第一个匹配的值。保存这两个值。
然后在2个上限和下限之间进行比较,以找到大于第一步中找到的值的任何值。这样它就能满足要求。在B =(x,y)问题中给出的例子中,X必须在Y之前,所以即使有最大的X但是在最后的Y之后,我们也不能选择它。
我相信它会在O(MxN)时间运行,但我非常不确定,这就是为什么我问你们。
感谢您的时间,希望你们能帮助我。
答案 0 :(得分:1)
你的解决方案根本不像动态编程那样。
问题基本上要求找到最大总和longest common subsequence,其中公共子序列介于AWSElasticBeanstalk client = new AWSElasticBeanstalkClient();
client.configureRegion(Regions.US_WEST_2);
和A
之间,总和来自B
。
应该可以针对您的问题调整LCS解决方案。由于您必须从P
中选择总和,因此在构建P
矩阵后,请考虑使用经典的回溯算法来获取实际的LCS:
LCS
现在你需要找到最大总和:
backtrack(LCS, A, B, i, j):
if i == 0 or j == 0
return ""
if A[i] == B[j]:
return backtrack(LCS, A, B, i-1, j-1) + A[i]
else if LCS[i-1, j] > LCS[i, j-1]:
return backtrack(LCS, A, B, i-1, j)
return backtrack(LCS, A, B, i, j-1)
您可能必须应用memoization以实现高效实施。还应该可以在LCS矩阵旁边(或甚至代替)计算和矩阵。