arrays - 检查特殊数组方程的子集总和
问题描述
我试图解决以下问题。
我们得到 N 和 A[0]
N <= 5000
A[0] <= 10^6 and even
if i is odd then
A[i] >= 3 * A[i-1]
if i is even
A[i]= 2 * A[i-1] + 3 * A[i-2]
element at odd index must be odd and at even it must be even.
我们需要最小化数组的总和。
我们得到一个 Q 数字
Q <= 1000
X<= 10^18
我们需要确定是否有可能从我们的数组中获得子集和 = X。
我尝试过的,
创建最小和数组很容易。只需遵循方程式和约束即可。
我所知道的子集和方法是动态编程,它具有时间复杂度 sum*sizeof(Array) 但由于 sum 可以大到 10^18,这种方法将不起作用。
我是否缺少任何方程关系?
解决方案
我们可以用一点数学来做到这一点:对不起,乳胶我不确定它是否可能在堆栈上?
让X_n
是序列(与您的定义相同A
)
我认为X_0
是积极的。
因此序列是严格递增的,并且最小化发生在X_{2n+1} = 3X_{2n}
我们可以计算X_{2n}
和X_{2n+1}
v_0 =
X0
X1
v_1 =
X1
X2
v_0
和之间的关系v_1
是
M_a =
0 1
3 2
v_1
和之间的关系v_2
是
M_b =
0 1
0 3
v_2
因此和之间的关系v_0
是
M = M_bM_a =
3 2
9 6
我们推断
v_{2n} =
X_{2n}
X_{2n+1}
v_{2n} = M^n v_0
遵循经典的对角化......我们(除非弄错)得到
X_{2n} = 9^n/3 X_0 + 2*9^{n-1}X_1
X_{2n+1} = 9^n X_0 + 2*9^{n-1}/3X_1
回想一下,X_1 = 3X_0
因此
X_{2n} = 9^n X_0
X_{2n+1} = 3.9^n X_0
现在,如果我们表示我们想要以 9 为基数检查的总和,我们得到
9^{n+1} 9^n
___ ________ ___ ___
X^{2n+2} X^2n
在这些X^{2n}
地方我们只能放置一个 1 或一个 0(这意味着我们2n-th
从 中获取元素A
)我们也可以将 a3
放在这个地方的X^{2n}
位置,这意味着我们2n+1th
从数组中选择了元素
所以我们只需要分解 base9
中的数字,并检查它的所有数字或其中一个0,1
或3
(以及它的前导数字是否超出我们的数组范围......)
推荐阅读
- c - 如何将带引号的命令传递给 system()?
- ssh - 将 iSeries SFTP 自动化到远程 SFTP 主机
- c - 调用 recv() 函数时接收多个 html 内容?
- angular - 在 ngfor 之外使用计数器
- slider - 在 MDC 滑块上实现纹波
- javascript - div 元素只有在点击后才能正确加载
- windows - Jenkins:在 Windows 上部署和更新 java(及其他)
- java - 双 d = 1000 / 3600;结果为0?
- delphi - 测试字符串长度比与空字符串相比生成更多代码?
- php - 使用 jquery 和 ajax 删除表行(foreach 循环)