递推专题(一)HDU2044——2050

来源:互联网 发布:graph cut算法原理 编辑:程序博客网 时间:2024/06/05 16:12

在Hdu上是下面几题

Hdu 2041 超级楼梯

下面是解题报告(因为有的题有点水,和贴发)

Hdu 2044 一只小蜜蜂...

     分析:数一下前几种可能的走法,不难发现这是个斐波那契数。但是题目给定任意两个数a和b(a<b),计算a到b的走法。因为是从a到b的走法,所以从1到a的走法我们不用讨论,同理从1到b的走法我们也不用讨论。这样,就可以将a看做1,将b看做(b-a+1),转化为求从1到(b-a+1)的走法。

o(╯□╰)o:只知道是斐波那契数,但是布吉岛斐波那契数数的增长很快,很容易爆int。

下面是代码:

[html] view plain copy
print?
  1. /*Hdu 2044 一只小蜜蜂...  
  2.    递推 斐波那契数  
  3.    数组开long long,斐波那契数增长很快  
  4. */  
  5. #include<iostream>  
  6. using namespace std;  
  7. const int maxn = 60;  
  8. long long f[maxn];  
  9. int t,a,b;  
  10. int main()  
  11. {  
  12.     f[1] = 1;  
  13.     f[2] = 1;  
  14.     for(int i = 3; i <= maxn; i++)   f[i] = f[i-1] + f[i-2];  
  15.     cin>>t;  
  16.     while(t--)  
  17.     {  
  18.         cin>>a>>b;  
  19.         cout<<f[b-a+1]<<endl;  
  20.     }  
  21.     return 0;  
  22. }  

Hdu 2045 不容易系列之(3)—— LELE的RPG难题

  分析:

  

下面是代码:

[html] view plain copy
print?
  1. #include<iostream>  
  2. using namespace std;  
  3. const int maxn = 55;  
  4. long long F[maxn];  
  5. int n;  
  6. int main()  
  7. {  
  8.     F[1] = 3;  
  9.     F[2] = 6;  
  10.     F[3] = 6;  
  11.     for(int i = 4; i <= maxn; i++) F[i] = F[i-1] + 2 * F[i-2];  
  12.     while(cin>>n)    cout<<F[n]<<endl;  
  13.     return 0;  
  14. }  

Hdu 2046 骨牌铺方路

  分析:前一排只有一种方法,所以只用讨论F[n-1];前二排也只有一种方法,那么讨论F[n-2]。所以递推式:F[n] = F[n-1] + F[n-2]。这也是斐波那契数。

下面是代码:

[html] view plain copy
print?
  1. #include<iostream>  
  2. using namespace std;  
  3. const int maxn = 55;  
  4. long long f[maxn];  
  5. int n;  
  6. int main()  
  7. {  
  8.     f[0] = 1;  
  9.     f[1] = 1;  
  10.     for(int i = 2; i <= maxn; i++) f[i] = f[i-1] + f[i-2];  
  11.     while(cin>>n) cout<<f[n]<<endl;  
  12.     return 0;  
  13. }  

Hdu 2047 阿牛的EOF牛肉串

  分析:设F[n]可以由两个部分得到,第(n-1)个为O,第(n-1)个为O。

               F[n] = 2 * (为O) + 3 *(不为O)

下面是代码:

[html] view plain copy
print?
  1. #include<iostream>  
  2. using namespace std;  
  3. const int maxn = 45;  
  4. long long A[maxn];  
  5. long long B[maxn];  
  6. int n;  
  7. int main()  
  8. {  
  9.     A[1] = 1;  
  10.     B[1] = 2;  
  11.     for(int i = 2; i <= maxn; i++)  
  12.     {  
  13.         A[i] = B[i-1];  
  14.         B[i] = 2 * (A[i-1] +B[i-1]);  
  15.     }  
  16.     while(cin>>n) cout<<A[n]+B[n]<<endl;  
  17.     return 0;  
  18. }  




Hdu 2048 神,上帝和老天爷

    分析:全错位排列。当n小于8时,用递推求解;当n大于8时,基本上概率不变。不过犯二了,记错变形后的递推公式了,囧!

下面是代码“:

[html] view plain copy
print?
  1. /*Hdu 2048 神,上帝和老天爷  
  2.    全错位排列  
  3. */  
  4. #include<cstdio>  
  5. #include<cmath>  
  6. using namespace std;  
  7. const int maxn = 50;  
  8. double D[maxn];  
  9. int n;  
  10. int main()  
  11. {  
  12.     D[1] = 0;  
  13.     D[2] = 1;  
  14.     int t;  
  15.     scanf("%d",&t);  
  16.     while(t--)  
  17.     {  
  18.         double f = 1;  
  19.         scanf("%d",&n);  
  20.         if(n <= 10)  
  21.         {  
  22.             for(int i = 2; i <= n; i++)  
  23.             {  
  24.                 f = f * i;  
  25.                 double flag;  
  26.                 if(i%2 == 0) flag = +1;  
  27.                 else flag = -1;  
  28.                 D[i] = i * D[i-1] + flag;  
  29.             }  
  30.             int ans = floor((D[n]/f+0.00005)*10000);  
  31.             printf("%.2lf%\n",(double)ans/100);  
  32.         }  
  33.         else  
  34.             printf("36.79%10\n");  
  35.     }  
  36.     return 0;  
  37. }  

Hdu 2049 不容易系列之(4)——考新郎

      分析:这到题和上一题相似,都是错位排列。只不过上一题是全错位排列,只一题是部分错位排列。但是原理没有什么不一样的。

下面是代码:

[html] view plain copy
print?
  1. #include<iostream>  
  2. using namespace std;  
  3. const int maxn = 25;  
  4. long long F[maxn],C[maxn];  
  5. int t,n,m;  
  6. int main()  
  7. {  
  8.     F[1] = 0;  
  9.     F[2] = 1;  
  10.     C[0] = 1;  
  11.     for(int i = 3; i <= maxn; i++) F[i] = (i-1) * (F[i-1] + F[i-2]);  
  12.   
  13.     cin>>t;  
  14.     while(t--)  
  15.     {  
  16.         cin>>n>>m;  
  17.         for(int i = 1; i <= n; i++) C[i] = C[i-1]*(n-i+1)/i;  
  18.         cout<<C[m]*F[m]<<endl;  
  19.     }  
  20.     return 0;  
  21. }  

Hdu 2050 折线分割平面

  分析:首先搞清楚直线分割平面问题,然后再根据直线问题解决折线问题。

下面是代码:

[html] view plain copy
print?
  1. #include<iostream>  
  2. using namespace std;  
  3. int n,t;  
  4. int main()  
  5. {  
  6.     cin>>t;  
  7.     while(t--)  
  8.     {  
  9.         cin>>n;  
  10.         cout<<1 + (2*n)*(2*n+1)/2 - 2*n<<endl;  
  11.     }  
  12.     return 0;  
  13. }  


Hdu 2041 超级楼梯

    很简单的递推题,直接代码

[html] view plain copy
print?
  1. #include<iostream>  
  2. using namespace std;  
  3. const int maxn = 50;  
  4. int d[maxn];  
  5. int t,n;  
  6. void print()  
  7. {  
  8.     d[1] = 1;  
  9.     d[2] = 1;  
  10.     for(int i = 3; i < maxn; i++)  
  11.     {  
  12.         d[i] = d[i-1] + d[i-2];  
  13.     }  
  14. }  
  15. int main()  
  16. {  
  17.     cin>>t;  
  18.     print();  
  19.     while(t--)  
  20.     {  
  21.         cin>>n;  
  22.         cout<<d[n]<<endl;  
  23.     }  
  24.     return 0;  
  25. }  


 

好了,前前后后花了不少时间才刷完这几道递推入门题。都是很基础的一些问题。

原创粉丝点击