递归、记忆搜索、动态规划
//初始n对牛,每一个月生一对牛
//新出生的牛,需成长三个月,第四个月才能生小牛
//月份: 1 2 3 4 5 6
//牛队数:2 3 4 5 7 10
//方法一:递推公式
int n,month;
vector<int > dp;
int fun1(int n, int m)
{
if(m < 4)
return (m+1)*n;
return fun1(n, m-1) +fun1(n,m-4);
}
//方法二:记忆搜索法
//从后往前记录对应月份牛的对数
int fun(int n,int m)
{
if(m < 4)
return dp[m+1] = (m+1)*n;
else
{
if (dp[m-1] == 0)
dp[m-1] = fun(n,m-1);
if (dp[m-4] == 0);
dp[m-4] = fun(n,m-4);
return dp[m-1] + dp[m-4];
}
}
//方法三:动态规划
vector<int > dpreal;
int dpfun(int n, int m) {
for (int i = 1; i <= 4; ++i)
dpreal[i] = (i+1)*n;
for (int i = 5; i <= m; ++i)
dpreal[i] = dpreal[i-1] + dpreal[i-4];
return dpreal[m];
}
//费波纳切数列 滚动记录数值
int fibo(int n) {
if (n <= 2)
return 1;
int fir = 1;
int second = 1;
int res = 0;
for (int i = 3; i <= n; ++i) {
res = fir + second;
fir = second;
second = res;
}
return res;
}
//青蛙一次可以跳一阶,也可以跳两阶
//求跳 number阶台阶 的可能性
//模拟跳台阶过程
int dfs(int sum, int number) { //sum为当前调台阶数目
//cout << sum << endl;
if (sum == number)
return 1;
if (sum > number)
return 0;
int temp = 0;
//if (sum +1 <= number)
temp += dfs(sum + 1, number);
//if (sum + 2 <= number)
temp += dfs(sum + 2, number);
return temp;
}