HDU 2018 母牛的故事 简单动态规划
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2018
题目描述:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
题解:
针对这道题目我们可以进行如下的分析:
假设g(n,i)表示到第n年年纪为i的牛的数量,其中i=0表示是年龄为0岁(刚出生)的牛,i=1表示是年龄为1岁的牛,i=2表示是年龄为2岁的牛,i=3表示是年龄>=3的牛(因为年龄>=3的牛都是具有生育能力的牛,所以放在一起分析)。可以得出如下状态转移方程:
g(n+1,1)=g(n,0)
g(n+1,2)=g(n,1)
g(n+1,3)=g(n,2)+g(n,3)
g(n+1,0)=g(n+1,3)
一开始当n=1时,g(1,0) = g(1,1) = g(1,2) = 0,g(1,3) = 1。我们可以根据初始条件和上面列出的状态转移方程进行求解。第n年的奶牛总数是g(n,0)+g(n,1)+g(n,2)+g(n,3)。
C++代码:
#include <cstdio> int n, g[56][4]; void init() { g[1][0] = g[1][1] = g[1][2] = 0; g[1][3] = 1; for (int i = 2; i <= 55; i ++) { g[i][1] = g[i-1][0]; g[i][2] = g[i-1][1]; g[i][0] = g[i][3] = g[i-1][2] + g[i-1][3]; } } int main() { init(); while (~scanf("%d", &n) && n) { printf("%d\n", g[n][0]+g[n][1]+g[n][2]+g[n][3]); } return 0; }
最后还有一个问题:问什么母牛生的都是母牛?为什么没有公牛?没有公牛为什么还能生小牛:)