动态规划
求解决策过程(decision process)最优化的数学方法。
一、组合C(n,k),时间复杂度为O(n*k),空间复杂度为O(n^2),直接上代码
int min(int a1,int a2) {
return a1<a2 ? a1 : a2;
}
int CNK(int n,int k){
int **a = (int**)malloc(sizeof(int*)*(n+1));
int i,j,r,result;
for(r=0;r<=n;r++)
a[r] = (int*)malloc(sizeof(int)*(n+1));
for(i=0;i<=n;i++)
for(j=0;j<=min(i,k);j++)
if(j==i || j==0)
a[i][j] = 1;
else
a[i][j] = a[i-1][j-1]+a[i-1][j];
result = a[n][k];
for(i=0;i<=n;i++) // free 2-Dimens array
free(*(a+i));
free(a);
return result;
}
二、优化空间 时间复杂度为O(k)
int CNK1(int n,int k){
if(n<0 || k<0)
return -1;
int total=k;
int r=1,s=1;
while(total>0){
r*=(n-total+1); // 分子
s*=total; // 分母
total--;
}
return (int)r/s;
}