递推是计算机数值计算中的一个重要算法,可以将复杂的运算化为若干重复的简单运算,充分发挥计算机长于重复处理的特点。
其实就是由前一个状态,推出后一个状态。
递推求解的基本方法:
首先,确认:能否容易的得到简单情况的解?
然后,假设:规模为N-1的情况已经得到解决。
最后,重点分析:当规模扩大到N时,如何枚举出所有的情况,并且要确保对于每一种子情况都能用已经得到的数据解决。
如果这样递推公式找不出来,可以尝试列出前几项,找规律。
强调
1、编程中的空间换时间的思想。就是开个数组,把需要范围内的数都计算出来,存入数组,输出调用即可。存储空间用的多点,但时间复杂度小了。
2、并不一定只是从N-1到N的分析。可能跟前几项都有关联,并不局限于N-1项。
3、一般递推题数会比较大,超出int范围,可以使用64位整数,甚至大整数。
hdu 2013 蟠桃记
假设倒数第n天有F(n)个桃子,倒数第n+1天有F(n+1)个桃子。
根据题意:F(n+1)-(F(n+1)/2+1)=F(n),即F(n+1)=2*(F(n)+1)
#include<stdio.h> int main() { int f,n; while(scanf("%d",&n)!=EOF) { f=1; while(n!=1)f=2*(f+1),n--; printf("%d\n",f); } return 0; }
hdu 2569 彼岸
这个题的关键是最后两块。n必须要与n-1 或者n-2相同。
如果n-1与n-2相同则有F[n-2]*3种。
若不同则n可以与n-1相同,也可以与n-2相同,固有2*(F[n-1]-F[n-2])种选择。
所以:F[n]=2*F[n-1]+F[n-2]
#include<stdio.h> int main() { int t,n; int i; __int64 a[44]; a[1]=3; a[2]=9; a[3]=21; for(i=4;i<=40;i++) a[i]=2*a[i-1]+a[i-2]; scanf("%d",&t); while(t--) { scanf("%d",&n); printf("%I64d\n",a[n]); } return 0; }