幾個簡單的遞歸題目


本來不打算寫這些的,感覺有點水,就是知道遞推公式就行啦,還有就是__int64的問題,輸出用I64d%

蟠桃記

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 62   Accepted Submission(s) : 46

Font: Times New Roman | Verdana | Georgia

Font Size:

Problem Description

喜歡西游記的同學肯定都知道悟空偷吃蟠桃的故事,你們一定都覺得這猴子太鬧騰了,其實你們是有所不知:悟空是在研究一個數學問題!
什么問題?他研究的問題是蟠桃一共有多少個!
不過,到最后,他還是沒能解決這個難題,呵呵^-^
當時的情況是這樣的:
第一天悟空吃掉桃子總數一半多一個,第二天又將剩下的桃子吃掉一半多一個,以后每天吃掉前一天剩下的一半多一個,到第n天准備吃的時候只剩下一個桃子。聰明的你,請幫悟空算一下,他第一天開始吃的時候桃子一共有多少個呢?

Input

輸入數據有多組,每組占一行,包含一個正整數n(1<n<30),表示只剩下一個桃子的時候是在第n天發生的。

Output

對於每組輸入數據,輸出第一天開始吃的時候桃子的總數,每個測試實例占一行。

Sample Input

2
4

Sample Output

4
22




View Code
#include<stdio.h>
int main()
{
    int n,x;
    while(scanf("%d",&n)!=EOF)
    {
        x=1;
        n--;
        while(n--)
        {
            x=2*(x+1);
        }
        printf("%d\n",x);
    }
    return 0;
}

第二題:

超級樓梯

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 95   Accepted Submission(s) : 43

Font: Times New Roman | Verdana | Georgia

Font Size:

Problem Description

有一樓梯共M級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第M級,共有多少種走法?

Input

輸入數據首先包含一個整數N,表示測試實例的個數,然后是N行數據,每行包含一個整數M(1<=M<=40),表示樓梯的級數。

Output

對於每個測試實例,請輸出不同走法的數量

Sample Input

2
2
3

Sample Output

1
2



View Code
#include<stdio.h>
int main()
{
    int T,n,a[45],i;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        a[0]=0;
        a[1]=1;
        for(i=2;i<=n;++i)
        {
            a[i]=a[i-1]+a[i-2];
        }
        if(n!=1)
            printf("%d\n",a[n]);
        else
            printf("0\n");
    }
    return 0;
}    

第三題:

一只小蜜蜂...

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 107   Accepted Submission(s) : 36

Font: Times New Roman | Verdana | Georgia

Font Size:

Problem Description

有一只經過訓練的蜜蜂只能爬向右側相鄰的蜂房,不能反向爬行。請編程計算蜜蜂從蜂房a爬到蜂房b的可能路線數。
其中,蜂房的結構如下所示。

Input

輸入數據的第一行是一個整數N,表示測試實例的個數,然后是N 行數據,每行包含兩個整數a和b(0<a<b<50)。

Output

對於每個測試實例,請輸出蜜蜂從蜂房a爬到蜂房b的可能路線數,每個實例的輸出占一行。

Sample Input

2
1 2
3 6

Sample Output

1
3
View Code
#include<stdio.h>
int main()
{
    __int64 f[60];
    int a,b,i,T;
    scanf("%d",&T);
    f[0]=0;
    while(T--)
    {
        scanf("%d%d",&a,&b);
        f[1]=1;
        f[2]=2;
        f[3]=3;
        for(i=4;i<=b-a;++i)
        {
            f[i]=f[i-2]+f[i-1];
        }
        printf("%I64d\n",f[b-a]);
    }
    return 0;
}

不容易系列之(3)—— LELE的RPG難題

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 99   Accepted Submission(s) : 32

Font: Times New Roman | Verdana | Georgia

Font Size:

Problem Description

人稱“AC女之殺手”的超級偶像LELE最近忽然玩起了深沉,這可急壞了眾多“Cole”(LELE的粉絲,即"可樂"),經過多方打探,某資深Cole終於知道了原因,原來,LELE最近研究起了著名的RPG難題:

有排成一行的n個方格,用紅(Red)、粉(Pink)、綠(Green)三色塗每個格子,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色.求全部的滿足要求的塗法.

以上就是著名的RPG難題.

如果你是Cole,我想你一定會想盡辦法幫助LELE解決這個問題的;如果不是,看在眾多漂亮的痛不欲生的Cole女的面子上,你也不會袖手旁觀吧?

Input

輸入數據包含多個測試實例,每個測試實例占一行,由一個整數N組成,(0<n<=50)。

Output

對於每個測試實例,請輸出全部的滿足要求的塗法,每個實例的輸出占一行。

Sample Input

1
2

Sample Output

3
6
 
 
           
這個題還有意思,用到高中學的染色問題,問題是我也忘了呀,可以看做環,最后一個時分情況,不過沒關系,我們有度娘,記住即可:

一般當n不大的時候都可以分開分析
但當塊數很大的時候,就很復雜了

首先是理解它的遞推公式,先把這n塊編號,從1到n,構成一圈
假設滿足的方法有an種,那么分成了n+1塊的時候,可以看成在前面n塊的基礎上
多了一塊,而這一塊必須不能和第1和第n塊顏色一樣,所以只有r-2種
那么這樣看的話就有(r-2)an種
又或者從n-1的基礎上多了兩塊,如果第n塊和第一塊同色,那么第n+1塊就有(r-1)種,如果不同色,那么就是上面提到的情況

所以總的來說遞推公式就是a(n+1)=(r-2)a(n)+(r-1)a(n-1)
明顯的有a(1)=r,a(2)=r(r-1)

 

 

View Code
#include<stdio.h>
int main()
{
    int n,x,i;
    __int64 a[55];
    a[0]=0;
    a[1]=3;
    a[2]=6;
    a[3]=6;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=4;i<=n;++i)
            a[i]=a[i-1]+2*a[i-2];
        printf("%I64d\n",a[n]);
    }
    return 0;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM