递推

递推是计算机数值计算中的一个重要算法,可以将复杂的运算化为若干重复的简单运算,充分发挥计算机长于重复处理的特点。

其实就是由前一个状态,推出后一个状态。
递推求解的基本方法:
首先,确认:能否容易的得到简单情况的解?
然后,假设:规模为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;
}


posted on 2012-07-30 13:58  Slege  阅读(202)  评论(0编辑  收藏  举报

导航