给定一个表示函数的整数值数组(如阶梯函数,每个值匹配一个时间单位,我们的目的是构建另一个函数(根据下面解释的规则),以便原始函数和#之间的差异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。
答案 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的值,而不是之前的值。