- 論壇徽章:
- 0
|
我的瑪雅,這么簡單的題目居然會引無數(shù)英雄盡折腰了,那么多的解答基本上都存在很打的邏輯漏洞
先不談什么規(guī)律了,那個不需要邏輯
兩個方案
1. 循環(huán)普通解法
思路:new 一個牛圈,里面每個元素代表一頭牛,元素值代表歲數(shù)。一年一年的循環(huán)計算,每個cow歲數(shù)都加一,如果歲數(shù)足夠大到生孩子的年齡就生一個
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. 動態(tài)規(guī)劃算法
思路:n年的牛的總頭數(shù) = 第1年出生的牛的頭數(shù)+第2年出生的牛的頭數(shù)+第3年出生的牛的頭數(shù)+。。。
而且 第n年出生的牛的頭數(shù) = 第1年出生的牛的頭數(shù)+第2年出生的牛的頭數(shù)+第3年出生的牛的頭數(shù)+。。。第n-3年出生的牛的頭數(shù)(凡是這些年出生的牛都可以生小牛了)
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;
}
看不懂的話就沒辦法了- -! |
|