static long calculateC(int n, int k){
if(k > n/2){
k = n-k;
}
long res = 0L;
List<Long> zero = new ArrayList<>();
zero.add(1L);
List<Long> lastTmp = new ArrayList<>(zero);
for(int i=1;i<=n;i++){
List<Long> tmp = new ArrayList<>();
tmp.add(1L);
if(i == n){
res = lastTmp.get(k-1) + lastTmp.get(k);
break;
}
if((i+1)%2 == 0){
for(int j=1;j<(i+1);j++){
if(j>(i+1)/2-1){
tmp.add(tmp.get(i-j));
continue;
}
tmp.add(lastTmp.get(j-1)+lastTmp.get(j));
}
}else{
for(int j=1;j<(i+1);j++){
if(j>(i+1)/2){
tmp.add(tmp.get(i-j));
continue;
}
tmp.add(lastTmp.get(j-1) + lastTmp.get(j));
}
}
lastTmp = new ArrayList<>(tmp);
}
return res;
}
使用动态规划,递推公式
C(0,0) = 1
C(1,0) = 1, C(1,1) = 1
C(2,0) = 1, C(2,1) = 2, C(2,2) = 1
…
…
…
C(n,0) = 1, C(n,1) = C(n,0) + C(n,1) …