Problem M ID:1013
简单题意:初始有一头母牛,每年年初生一头母牛,所有新出生的母牛从出生后的第四个年头开始,每年都生一头母牛。求第n年共有多少头母牛。
解题思路形成过程:使用两个数组,一个数组a存放(所有)当年出生的母牛数,另一个数组b存放(所有)从第一年到当年的总母牛数。
n<=3时,a[1]=1;a[2]=1;a[3]=1; b[1]=1;b[2]=2;b[3]=3;
n>3时,a[i]=a[i-3]+a[i-1]; b[i]=b[i-1]+a[i-1];
因为n的最大值是54,可以对所有的n进行预处理,将所有的结果存入数组中。
然后根据输入的n,直接调用数组输出结果即可。
感想:同样是一个比较简单的dp问题,但是一开始使用了错误的状态转移方程式,并导致了WA。
分析的时候要抓住本质,要抓住最根本的规律。
注意预处理。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int a[60],b[60];
int main()
{
int n;
//freopen("1.txt","r",stdin);
a[1]=1;a[2]=1;a[3]=1;
b[1]=1;b[2]=2;b[3]=3;
for(int i=4;i<57;++i)
{
a[i]=a[i-3]+a[i-1];
b[i]=b[i-1]+a[i-1];
}
while(1)
{
scanf("%d",&n);
if(n==0)
return 0;
printf("%d\n",b[n]);
}
}