动态规划之组合求解
2014-09-22 11:05
211 查看
动态规划
求解决策过程(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
[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;
}
求解决策过程(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
[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;
}
相关文章推荐
- Java求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包动态规划问题求解)
- 动态规划的求解步骤
- Fibonacci数列的求解之动态规划
- 动态规划:砝码的组合方案(2018届校招C/C++软件开发工程师)
- 常见的动态规划问题分析与求解
- POJ-1664 放苹果 动态规划思想解组合数学
- 动态规划在求解硬币问题中的应用(JAVA)--币制最大化、找零问题、硬币收集问题
- 动态规划求解0 1背包
- 动态规划--求最大连续子数组的和(Python实现)&求解最大连续乘积字串(Python实现)
- 最长公共子序列求解:递归与动态规划方法
- 走格子问题的动态规划求解
- HDU 1059(动态规划-多重组合)
- 0-1背包问题的动态规划求解
- Decode Ways,编码方式数量求解。动态规划问题。
- 动态规划求解序列问题(LIS、JLIS)
- 动态规划--最长递增(减)子队列.[九度1112][递推求解]
- 动态规划与排列组合
- 背包问题动态规划求解
- 常见的动态规划问题分析与求解
- [APIO 2016] 赛艇 Boat:动态规划、离散化、组合数学和常数优化