zoukankan      html  css  js  c++  java
  • 递推

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

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


  • 相关阅读:
    P1099 [NOIP2007 提高组] 树网的核
    UVA 数学题选做
    Codeforces 729 Div.2
    P1600 [NOIP2016 提高组] 天天爱跑步
    CF1106F Lunar New Year and a Recursive Sequence
    P6091 【模板】原根
    P4774 [NOI2018] 屠龙勇士
    P1106 删数问题
    P1209 [USACO1.3]修理牛棚 Barn Repair
    网络(network)
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6365330.html
Copyright © 2011-2022 走看看