我有这个Java问题,我怀疑它与更高级别的算法有关,但我的搜索无法提出任何实际问题。
您可以按如下方式构建数组:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
基本上,A i,j = A i-1,j-1 + A i-1,j 。它应该返回索引(l,c)处的元素:for(4,1)它应该返回4,(5,2)返回10,等等。我的解决方案很简单,但这还不够:
static long get(int l, int c){
long[][] matrix = new long[l+1][l+1];
matrix[0][0]=1;
matrix[1][0]=1;
matrix[1][1]=1;
for(int i=2;i<=l;i++){
matrix[i][0]=1;
for(int j=1;j<=i;j++){
matrix[i][j] = matrix[i-1][j-1]+matrix[i-1][j];
}
}
return matrix[l][c];
}
它不适用于l和c的大值。使用BigInteger不起作用。我的搜索导致我循环偏斜和标量化,但我不知道从哪里开始。真正赞赏任何正确方向的转向。
PS:对不起新手,这是我的第一个问题!
答案 0 :(得分:12)
您正在描述存在封闭式的Pascal's triangle:
matrix[n][k] = n!/(k! * (n-k)!)
P.S。如果这些数字看起来很熟悉,那是因为它们也来自binomial theorem,其中常见的例子是:
(x+y)^2 = 1* x^2 + 2xy + 1*y^2
(x+y)^3 = 1*x^3 + 3*xy^2 + 3yx^2 + 1*y^3
答案 1 :(得分:4)
答案 2 :(得分:0)
试试这个:
static long get(int l, int c) throws Exception {
if (l != c)
throw new Exception("l != c");
long[][] matrix = new long[l+1][l+1];
matrix[0][0]=1;
for (int i = 1; i <= l; ++i) {
for (int j = 0; j <= i; ++j) {
if (j - 1 >= 0) {
matrix[i][j] = matrix[i - 1][j] + matrix[i - 1][j - 1];
} else {
matrix[i][j] = matrix[i - 1][j];
}
}
}
return matrix[l][c];
}