1001 函数求值
定义超级和函数F如下:
F(0, n) = n,对于所有的正整数n..
F(k, n) = F(k – 1, 1) + F(k – 1, 2) + … + F(k – 1, n),对于所有的正整数k和n.
请实现下面Solution类中计算F(k, n)的函数(1 <= k, n <= 14).
class Solution {
public:
int F(int k, int n) {
}
};
例1:F(1, 3) = 6
例2:F(2, 3) = 10
例3:F(10, 10) = 167960
注意:你只需要提交Solution类的代码,你在本地可以编写main函数测试程序,但不需要提交main函数的代码. 注意不要修改类和函数的名称.
分析
动态规划,最简单直接的办法,代码写起来也比较简洁
F(k,n) = F(k, n - 1) + F(k - 1, n)
class Solution {
public:
int F(int k, int n) {
vector<vector<int> > f;
f.resize(k + 1, vector<int>(n + 1, 0));
for(int i = 0; i <= k; i++) {
for(int j = 1; j <= n; j++) {
if(i == 0)
f[i][j] = j;
else f[i][j] = f[i][j - 1] + f[i - 1][j];
}
}
return f[k][n];
}
};
还有一种比较笨的办法,就是都算出来
class Solution {
public:
int F(int k, int n) {
vector<vector <int> > res(k+1 ,vector<int>(n,0));
for (int j = 0; j < n; j++) {
res[0][j] = j + 1;
}
for(int i = 1; i <= k; i++) {
for (int j = 0; j < n; j++) {
for(int m = 0; m <= j; m++) {
res[i][j] += res[i - 1][m];
}
}
}
return res[k][n-1];
}
};