两个方案
1. 循环普通解法
思路:new 一个牛圈,里面每个元素代表一头牛,元素值代表岁数。一年一年的循环计算,每个cow岁数都加一,如果岁数足够大到生孩子的年龄就生一个
int cows(int year) {
int sum = 1;
const int N = 100;
int* cows = new int[N];
cows[0] = 1; //first cow is one year old
for(int i=0; i<year; i++) {
//如果cows容量越界,重新非配空间
int temp = sum;
for(int j=0; j<temp; j++) {
if(cows[j] >= 4)cows[sum++] = 2;
cows[j]++;
}
}
return sum;
}
int main() {
printf("%d/n", cows(10));
getchar();
return 0;
}
2. 动态规划算法
思路:n年的牛的总头数 = 第1年出生的牛的头数+第2年出生的牛的头数+第3年出生的牛的头数+。。。
而且 第n年出生的牛的头数 = 第1年出生的牛的头数+第2年出生的牛的头数+第3年出生的牛的头数+。。。第n-3年出生的牛的头数(凡是这些年出生的牛都可以生小牛了)
int cows(int year) {
int* cows = new int[year];
memset(cows, 0, year*4);
cows[0] = 1;
if(year <= 3)return 1;
for(int i=3; i<year; i++) {
for(int j=0; j<=i-3; j++)cows[i] += cows[j];
}
int sum = 0;
for(int i=0; i<year; i++) {
sum += cows[i];
}
return sum;
}
int main() {
printf("%d/n", cows(10));
getchar();
return 0;
}
源文档 <http://bbs.chinaunix.net/archiver/tid-130156-page-12.html>