我正在尝试找到三项式系数,我想避免在数组中使用负索引。在某些情况下,i或j将变为负数,并将返回数组超出范围的错误。无论如何,我可以将负索引中包含的数组镜像为正索引吗?
这里是递归公式:Recursion Formula
我认识到T(0,-1)= T(0,1),但如何实现?
示例:
行0:T(0,0)= 1,T(0,1)= 0 ...
第1行:T(1,0)= T(0,-1)+ T(0,0)+ T(0,1),T(2,0)...
[三项式系数T(n,k)是(1 + x + x ^ 2)^ n的展开中的x ^(n + k)的系数
三边形三角形(中间索引为0,0左侧为负,0右侧为正):
注意:下面的代码从中间索引0到右侧遍历数组。
public class ClassNameHere {
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
int k = Integer.parseInt(args[1]);
long[][] DP = new long[n + 1][k + 1];
DP[0][0] = 1;
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= Math.min(i, k); j++) {
if (i == j || ((j == 0) && i < 2)) DP[i][j] = 1;
else if (j < -i) {
DP[i][j] = 0;
}
else DP[i][j] = DP[i - 1][j];
}
}
System.out.println(DP[n][k]);
}
}
编辑:现在,我可以使用我的代码从T(0,0)到T(1,0)来获取术语,但是无法通过添加T(1,0)+继续超过T(2,0) T(1,1)+ T(1,2)。当我尝试实现[j + 1]时,它再次返回arraysoutofbounds ..我认为上述语句的实现有问题^有关如何进行此操作的任何建议?
我已找到原因。
可以通过在2D数组中初始化正确的长度来完成。
long[][] tri = new long[n + 1][k + n + 1];
并使用Math.abs()处理j索引将流向负索引的实例。
tri[i][j] = tri[i - 1][Math.abs(j - 1)] + tri[i - 1][j] + tri[i - 1][j + 1];