我们都知道递推(动态规划)是递归(搜索)的反向操作,本题虽然注明“【递归】”,但同样可以用递推方式解决本题。
由于本题很多题解都详细讲解了递归的方式,那么这篇题解将不再赘述递归的方式。
我们试着考虑一下从递推的方式解决本题,最重要的是什么?
对于一个动态规划问题,最重要也是最难的部分在于“状态转移方程”。为了推导出这个状态转移方程,我们不妨在Excel中制作一张表格,用于记录每年的母牛的数量,这里我们列举出前九年的母牛数量:
我们可以很轻易的看出从第四年开始,每年的母牛数量都等于前一年的母牛数量加上三年前的母牛数量即状态转移方程为: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 =