最佳和差

时间:2018-01-27 19:22:16

标签: algorithm optimization

给定一个表示函数的整数值数组(如阶梯函数,每个值匹配一个时间单位,我们的目的是构建另一个函数(根据下面解释的规则),以便原始函数和#之间的差异39; s积分和我们函数的积分最大。

规则是我们构建的函数可以有两种模式:

模式A:我们的函数值与给定函数匹配。

模式B:我们的函数是静态的,具有它的最后一个值。该功能不能在模式B中连续超过3个单位。

两个函数的初始点是相同的,即它们从同一个地方开始。

以下是我在Python中实现的天真递归算法:

def maximise(arr, sum, orig_sum, count, prev):
    if len(arr) == 0:
        return abs(orig_sum - sum)
    same_path = maximise(arr[1:], sum+arr[0], orig_sum+arr[0], 0, prev)
    if count < 3:
        static_path = maximise(arr[1:], sum+prev, orig_sum+arr[0], count+1, prev)
        if static_path > same_path:
            return static_path
    return same_path

arr = [float(x) for x in input().split()]
print(maximise(arr[1:], arr[0], arr[0], 0, arr[0]))

对于给定的函数,比如说[1, 2, 3, 4],正确的输出是6,因为保持常数为1会得到4的整数,而函数[1, 2, 3, 4]的积分是10。

1 个答案:

答案 0 :(得分:3)

提高速度的一种方法是计算一个数组f[t,b],这是您在t之前达到的最佳效果,因为您已完成使用{{1}模式B中的时间步骤。

根据你的约束,b只能取值0,1,2,3,所以你只需要计算这个数组的4 * n值。

每个数组值都可以通过较小的时间从值中轻松计算出来,因此总体而言,复杂度在时间步数上是线性的。

伪代码

b

原始代码中的错误

在原始代码中,您有以下行:

def dp(arr):
    """Compute largest integral difference for increasing functions"""
    n=len(arr)
    DP=[[0]*4 for t in range(n+1)]
    for t,a in enumerate(arr):
        DP[t+1][0] = max(DP[t])
        for b in range(1,4):
            if t-b<0:
                continue
            DP[t+1][b] = DP[t][b-1] + ( a - arr[t-b] )
    return max(DP[n])

def dp2(arr):
    """Compute largest integral difference for arbitrary functions"""
    arr2=[-a for a in arr]
    return max(dp(arr),dp(arr2))

我认为这应该是:

same_path = maximise(arr[1:], sum+arr[0], orig_sum+arr[0], 0, prev)

否则你说模式B重用了时间0的值,而不是之前的值。