数组反向递归找父id_腾讯校招C++练习题:母牛的故事——由递归到递推

我们都知道递推(动态规划)是递归(搜索)的反向操作,本题虽然注明“【递归】”,但同样可以用递推方式解决本题。

由于本题很多题解都详细讲解了递归的方式,那么这篇题解将不再赘述递归的方式。

我们试着考虑一下从递推的方式解决本题,最重要的是什么?
对于一个动态规划问题,最重要也是最难的部分在于“状态转移方程”。为了推导出这个状态转移方程,我们不妨在Excel中制作一张表格,用于记录每年的母牛的数量,这里我们列举出前九年的母牛数量:

b66af3cdf81dcc29dddfb5c5ff5c7c63.png

我们可以很轻易的看出从第四年开始,每年的母牛数量都等于前一年的母牛数量加上三年前的母牛数量即状态转移方程为:cows[i] = cows[i-1] + cows[i-3];

到此为止,我们已经解决了最难的部分,但是还有一些小问题,比如:我们前三年的能不能用状态转移方程表示出来。

其实我们可以直接初始化为1,2,3,但是为了整体简短些,我们换一种方式,我们可以将整个数组向后推三个位置,即前面流出三个位置用于保证cows[i-3]不越界,附初始化函数代码:

int cows[70];void init (){ for (int i = 0;i < 70;i ++){ cows[i] = 1;//全部赋为1,便于前三年母牛数量的增加 } for (int i = 5;i < 70;i ++){ cows[i] = cows[i-1] + cows[i-3];//状态转移方程 }}

本题对于cows开55个空间就足够,由于今年是建国70周年就开了70个空间。
由于我们将整个数据向后推移了三个空间,当我们输出答案时,也应该向后移三个空间。附AC代码:

#include #include #include #include #include #include //有很多头文件其实没有用到,由于个人习惯就写上了六个,至于为什么不用是因为早些版本的C++并没有整个头文件,就没有使用。int cows[70];void init (){ for (int i = 0;i < 70;i ++){ cows[i] = 1; } for (int i = 5;i < 70;i ++){ cows[i] = cows[i-1] + cows[i-3]; }}int main (){ int n; init (); while (scanf ("%d",&n) != EOF){//使用scanf的原因是scanf较cin快一点,printf同理。 if (n != 0){ printf ("%d",cows[n+3]);//我们初始化将所有数据顺移三个单位,这里为保证结构正确也顺移三个单位。 } } return 0;}

最后,如果你想学C/C++可以私信小编“01”获取素材资料以及开发工具和听课权限!

c782ae2ac7c9158dc861bf9855a7d3dc.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值