题解:根据题意可以进行递归模拟,此方法最为简便,不过当n大于500时,会造成堆栈溢出或时间复杂度过高等问题。
递归的代码参考如下:
int f(int n){
if(n == 1) return 1;
int result = 0;
for(int i = 1; i <= n/2; ++i)
result += f(i);
return result + 1;
}所以考虑递推的做法,先举例来演算,以4为例
可以组成14,24,124,4
可以推得
f[1]=1
f[2]=2=f[1]+1
f[3]=2=f[1]+1
f[4]=4=f[1]+f[2]+1
f[5]=4=f[1]+f[2]+1
以此类推,参考代码如下
long long solve(int n)
{
// write code here
long long f[10001] = {0};
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i / 2; j++)
{
f[i] += f[j];
}
f[i]++;
}
return f[n];
}不过时间复杂度为n^2
可以在此基础上继续优化,参考代码如下
时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回最多满足条件的组法
* @param n int整型
* @return long长整型
*/
long long solve(int n) {
// write code here
long long f[10005] = {0};
long long sum[5005] = {0};
f[1] = 1;
for (int i = 2; i <= n; ++i)
{
sum[i / 2] = sum[i / 2 - 1] + f[i / 2];
f[i] = sum[i / 2] + 1;
}
return f[n];
}
};
京公网安备 11010502036488号