几道递推题目

来源:互联网 发布:ubuntu 开机启动命令 编辑:程序博客网 时间:2024/05/16 13:38

HDOJ 1465 不容易系列之一

/*HDOJ 1465错排公式与 _int64 类型的用法*/#include <stdio.h>_int64 C[25];_int64 Count(int n){if(C[n] != 0)return C[n];else{C[n-1]=Count(n-1);C[n-2]=Count(n-2);//下面是错排公式C[n]=(n-1)*(C[n-1]+C[n-2]);return C[n];}}int main(){C[1]=0;C[2]=1;int n;while(scanf("%d",&n) != EOF){printf("%I64d\n",Count(n));}return 0;}

HDOJ 2044 一只小蜜蜂

/*HDOJ 2044f[n]表示的是输入的两个数 a,b之间的差值,通过观察,可以得出 f[n]=f[n-1]+f[n-2] (n>2)*/#include <stdio.h>int main(){_int64 f[55];f[0]=1;f[1]=1;f[2]=2;for(int i=3;i<51;i++)f[i]=f[i-1]+f[i-2];int n,a,b;scanf("%d",&n);while(n--){scanf("%d%d",&a,&b);a=b-a;printf("%I64d\n",f[a]);}return 0;}

HDOJ 2045 LELE的RPG问题

/*HDOJ 2045 PRG难题现在共有i个格子的时候,如果第i-1个和第一个相同,那么第i-2个肯定就和第一个不一样此时,最后一个可以有两种涂色方案如果第i-1个和第一个不一样,那么最后一个格子只有一种颜色可以涂所以 f[i]=f[i-1]+2*f[i-2] (i>3)*/#include <stdio.h>int main(){int n,i,j;_int64 f[51];f[1]=3;f[2]=6;f[3]=6;for(i=4;i<51;i++){f[i]=f[i-1]+2*f[i-2];}while(scanf("%d",&n) != EOF){printf("%I64d\n",f[n]);}return 0;}

HDOJ 2046 骨牌铺方格

/*HDOJ 2046 骨牌铺方格有1*n个方格的时候,可以是在n-1个方格的时候,最后加上一张也可以是在n-2个方格的时候,加上两张横放的。如果是加上两张竖放的那就和竖放一张那种方案重复了。所以 f(n)=f(n-1)+f(n-2); 斐波那契数列*/#include <stdio.h>int main(){_int64 f[55];int i,n;f[0]=1;f[1]=1;f[2]=2;f[3]=3;for(i=4;i<=50;i++)f[i]=f[i-1]+f[i-2];while(scanf("%d",&n) != EOF)printf("%I64d\n",f[n]);return 0;}

HDOJ 2047 阿牛的EOF牛肉串

/*HDOJ 2047 f[n]表示长度为n的时候的方案数目。加入第n个字符的时候,有几种选择,要看它前面的当第n-1个是O的时候,那么它后面只可以是E or F,有两种选择并且此时,第n-2个一定是 E/F。此时 f[n]=2*f[n-2];当第n-1个不是O的时候,那么它的后面可以是 EOF 中任意一个。此时,f[n]=3*f[n-1];起初我也认为,这样答案不就是 f[n]=3*f[n-1]+2*f[n-2]吗?但是,其实这两种讨论是有重复的地方的,那就是在第一种情况中,第n-2个是E/F的时候,和第二种情况的第n-1个是E/F的,情况是有重复的当第n-2个是E/F时,包含了一种第n-1个E/F时的一种情况,所以要减去一个f[n-1];所以 f[n]=2*(f[n-2]+f[n-1]);*/#include <stdio.h>int main(){int n,i;_int64 f[41];f[1]=3;f[2]=8;f[3]=22;for(i=4;i<41;i++)f[i]=2*(f[i-1]+f[i-2]);while(scanf("%d",&n) != EOF)printf("%I64d\n",f[n]);return 0;}

HDOJ 2050 折线分割平面

#include <iostream>using namespace std;int Count(int n){if(n == 1)return 2;else{int fn;fn=Count(n-1)+4*(n-1)+1;return fn;}}int main(){int nCase,n;cin>>nCase;while(nCase--){cin>>n;cout<<Count(n)<<endl;}return 0;}