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;
    }


  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6365330.html
Copyright © 2011-2022 走看看