- 论坛徽章:
- 0
|
我的玛雅,这么简单的题目居然会引无数英雄尽折腰了,那么多的解答基本上都存在很打的逻辑漏洞
先不谈什么规律了,那个不需要逻辑
两个方案
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 += cows[j];
}
int sum = 0;
for(int i=0; i<year; i++) {
sum += cows;
}
return sum;
}
int main() {
printf("%d\n", cows(10));
getchar();
return 0;
}
看不懂的话就没办法了- -! |
|