题目标题
Problem Description
为情所困退学在家的钱哥毅然决定养猪!
在2010年1月1日,他买了一只刚出生的母猪幼仔,假设每只小母猪从第3个年头开始,每年的第一天都会生出4只小母猪,同时,钱哥会在每年的12月31日售出所有差一天就要年满5周岁的猪。
请计算:在第N年(2010年是第1年,2011是第2年,依次类推)的今天(5月4日),钱哥的养猪场会存栏多少只猪?
Input
输入数据第一行是一个整数T(0<T<=40),表示测试数据的组数.
接下来有T行,每行有一个数N(0<N<=40)表示一组测试数据,其含义如题目描述。
Output
对于每个测试实例,请输出在第N年的今天母猪的数量,每组数据的输出占一行。
Sample Input:
3
2
3
5
Sample Output:
1
5
29
解题思路:
要求每年1月1日猪的数量,dp数组存放每年1月1日猪的增加数量,2个年头、3个年头、4个年头前出生的猪的数量乘4就是这个年头出生的猪的数量。五个年头前出生的猪的数量是这个年头要减少的猪的数量。这个年头猪的数量就等于去年的猪的数量加上增加的数量,减去减少的数量。具体看代码理解。
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 45;
int dp[maxn],ans[maxn];
int main(int argc, char **argv){
fill(dp, dp+maxn, 0);
fill(ans, ans+maxn, 0);
dp[1]=1;dp[2]=0;dp[3]=4;dp[4]=4;dp[5]=20;
ans[1]=1;ans[2]=1;ans[3]=5,ans[4]=9,ans[5]=29;
for(int i=6;i<=40;i++){
for(int j=i-4;j<=i-2;j++){
dp[i]+=dp[j]*4;
}
ans[i]=ans[i-1]+dp[i]-dp[i-5];
}
int T,n;
while(~scanf("%d",&T)){
while(T--){
scanf("%d",&n);
printf("%d\n",ans[n]);
}
}
return 0;
}