给出了长度为 n 的数组。查找子数组元素的乘积之和。
说明
数组 A* = 长度 3的 [2,3,4] 。 *
长度为 2的 子数组= [2,3],[3,4],[2,4]
[2,3] 中元素的乘积= 6
[3,4] 中元素的乘积= 12
[2,4] 中元素的乘积= 8
长度 2 = 6 + 12 + 8 = 26的子数组的总和
同样,对于长度 3 ,Sum = 24
因此,乘积以模 1000000007 计算的子数组的长度可能更大。
找到所有可能长度(即1、2、3,......,n)的子数组的和的有效方法是什么,其中 n 是数组的长度。
我们首先创建一个递归关系。令f(n, k)
为length的子数组与length k
的数组a
的所有乘积之和n
。基本情况很简单:
f(0, k) = 0 for all k
f(n, 0) = 1 for all n
第二个规则似乎有点违反直觉,但是1是乘法的零元素。
现在我们找到的递归关系f(n+1, k)
。我们想要size的所有子数组的乘积k
。这里有两种类型的子数组:包含的子数组a[n+1]
和不包含的子数组a[n+1]
。不包括在内的总和a[n+1]
就是f(n, k)
。所包含a[n+1]
的恰好是所有长度加k-1
在一起的子数组a[n+1]
,因此它们的总和为a[n+1] * f(n, k-1)
。
这样就完成了我们的重复关系:
f(n, k) = 0 if n = 0
= 1 if k = 0
= f(n-1, k) + a[n] * f(n-1, k-1) otherwise
您可以使用巧妙的技巧在动态编程中使用非常有限的内存,因为函数f
仅取决于两个较早的值:
int[] compute(int[] a) {
int N = a.length;
int[] f = int[N];
f[0] = 1;
for (int n = 1; n < N; n++) {
for (int k = n; k >= 1; k--) {
f[k] = (f[k] + a[n] * f[k-1]) % 1000000007;
}
}
return f;
}
给出了一个长度为n的数组。求子数组元素的乘积之和。 解释 长度为3的数组A=[2,3,4]。 因为,对于以模1000000007计算的较长的子数组,乘积可以更大。 对于所有可能长度的子数组,即1,2,3,....,n,求这些和的有效方法是什么,其中n是数组的长度。
我有这个问题: 您将获得一个整数 A 和一个整数 k 的数组。您可以将 A 的元素递减到 k 次,目标是生成一个元素都相等的连续子数组。返回可以用这种方式生成的最长的连续子数组的长度。 例如,如果 A 是 [1,7,3,4,6,5] 并且 k 是 6,那么您可以生成 [1,7,3,4-1,6-1-1-1,5-1-1] = [1,7,3,3,3,3],因此您将返回 4。 最佳解决方案是什么?
给定一个整数N和一个长度为N的数组,该数组由0到N-1的整数组成,可能包含也可能不包含所有整数,也可能包含重复数。查找一个从索引i到索引j的子数组(i, j),使其包含数组中的所有整数,并且具有最小长度。输出是这样一个子数组的长度 示例:A=[2,1,1,3,2,1,1,3],因此最小子数组长度=3,因为A[2]到A[4]包含所有数字 我的想法: 维护一个计数器数组和两个索引开始和结束,其中包含数
给定一个数组,我想计算子数组的数量(连续的),当取的乘积不会被k整除。 例如。设 A = 和 K = 2 则使乘积不能被 K 整除的子数组数为 2: 其余的都可以被2整除。 我首先尝试计算子数组(n)(n 1)/2的总数,然后使用mod减去可被k整除的子数组的数量,但它不起作用。我该如何解决这个问题? 这(错误地)计算了乘积可被K整除的子阵列数: 一个稍微相关的问题是这个问题,但它涉及加法,因此不
给定一个大小为n, n的数组
本文向大家介绍LCM的最大长度子数组等于C ++中的乘积,包括了LCM的最大长度子数组等于C ++中的乘积的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个数组A。我们必须找到子数组的最大长度,它的LCM与该子数组元素的乘积相同。如果找不到这种子数组,则返回-1。假设数组为{6,10,21},则长度为2,因为在那里有子数组{10,21},其LCM为210,乘积也为210。 该方法是直接的。我