【发布时间】:2023-04-09 10:53:01
【问题描述】:
我尝试了这个 Codility 测试:MinAbsSum。 https://codility.com/programmers/lessons/17-dynamic_programming/min_abs_sum/
我通过搜索整个可能性树解决了这个问题。结果还可以,但是,由于大输入超时,我的解决方案失败了。换句话说,时间复杂度没有预期的那么好。我的解决方案是 O(nlogn),这对于树木来说是正常的。但是这个编码测试在“动态编程”一节中,必须有一些方法来改进它。我尝试先对整个集合求和,然后使用这些信息,但我的解决方案中总是缺少一些东西。有人知道如何使用 DP 改进我的解决方案吗?
#include <vector>
using namespace std;
int sum(vector<int>& A, size_t i, int s)
{
if (i == A.size())
return s;
int tmpl = s + A[i];
int tmpr = s - A[i];
return min (abs(sum(A, i+1, tmpl)), abs(sum(A, i+1, tmpr)));
}
int solution(vector<int> &A) {
return sum(A, 0, 0);
}
【问题讨论】:
-
您的解决方案是
O(2^n) -
动态编程通常意味着某种查找表的参与