hdu1290 - 獻給杭電五十週年校慶的禮物 (遞推求解)(找規律)

獻給杭電五十週年校慶的禮物

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6878    Accepted Submission(s): 3726


Problem Description
或許你曾經牢騷滿腹
或許你依然心懷憂傷
或許你近在咫尺
或許你我天各一方

對於每一個學子
母校 
永遠航行在
生命的海洋

今年是我們杭電建校五十週年,這是一個值得祝福的日子。我們該送給母校一個怎樣的禮物呢?對於目前的大家來說,最好的禮物當然是省賽中的好成績,我不能參賽,就送給學校一個DOOM III球形大蛋糕吧,這可是名牌,估計要花掉我半年的銀子呢。

想象着正式校慶那一天,校長親自操刀,把這個大蛋糕分給各地趕來祝賀的校友們,大家一定很高興,呵呵,流口水了吧...

等一等,吃蛋糕之前先考大家一個問題:如果校長大人在蛋糕上切了N刀(校長刀法極好,每一刀都是一個絕對的平面),最多可以把這個球形蛋糕切成幾塊呢?

做不出這個題目,沒有蛋糕吃的!
爲-了-母-校-,爲-了-蛋-糕-(不是爲了DGMM,楓之羽最會浮想聯翩...),加-油-!
 

Input
輸入數據包含多個測試實例,每個實例佔一行,每行包含一個整數n(1<=n<=1000),表示切的刀數。
 

Output
對於每組輸入數據,請輸出對應的蛋糕塊數,每個測試實例輸出一行。
 

Sample Input
1 2 3
 

Sample Output
2 4 8
 

Author
lcy
 

Source
 
遞推求解:
/****************************************
*
*   acm:   hdu-1290
*
*   title: 獻給杭電五十週年校慶的禮物
*
*   time : 2014.5.17
*
*****************************************/

//考察遞推求解


#include <stdio.h>
#include <stdlib.h>

int fun(int n)  //表示空間
{
    int g(int n);
    int res;

    if (n == 1)
    {
        res = 2;
    }
    else
    {
        res = fun(n - 1) + g(n - 1);
    }

    return res;
}

int g(int n) //表示平面
{
    int res;

    if (n == 1)
    {
        res = 2;
    }
    else
    {
        res = g(n - 1) + n;
    }

    return res;
}

int main()
{
    int n;

    while (~scanf("%d", &n))
    {
        printf("%d\n", fun(n));
    }

    return 0;
}

通過遞推找到規律直接求解:
 
坑啊,推倒一半就不會捏到一起,無奈,思路如下:
 
f(n) = f(n -1) + g(n - 1)
 
g(n) = n*(n + 1) / 2 + 1
 
so: f(n) = f(n - 1) + (n - 1)*n/2 + 1
            = f(n - 2) + (n - 2)*(n - 1)/2 + 1 + (n - 1)*n/2 + 1
            ......
            = f(1) + 1*2/2 + 2*3/2 + 3*4/2 + 4*5/2 +.....+(n-1)*n/2 + (n-1)
            = 2 + 1 + 3 + 6 + 10 + 15 + ......+(n-1)*n/2 + n-1
 
1      +      2     ==     3
3      +      3     ==     6
6      +      4     ==    10
10    +      5     ==    15
15    +      6     ==    21
 
.........然後怎麼歸納成和的形式?卡住大哭
 
    ..............
           f(n)  = f(1) + 1*2/2 + 2*3/2 + 3*4/2 + 4*5/2 +.....+(n-1)*n/2 + (n-1)
                   =  2 + (1*2 + 2*3 + 3*4 +......+ (n-1)*n) / 2 + (n -1 )
                   =  2 + (1 + 2^2 -2 + 3^3 - 3 + 4^4 -4 +.......+ (n-1)^2 - n -1) / 2 + n + 1
                   =  (1 + 2^2 + 3^2 + 4^2 + ..... + n^2 -1 -2 -3 -......-n) / 2 + n + 1
                   = (n^3 +5n) / 6 + 1
 
 
/****************************************
*
*   acm:   hdu-1290
*
*   title: 獻給杭電五十週年校慶的禮物
*
*   time : 2014.5.17
*
*****************************************/

//考察遞推求解

//本題遞推後歸納公式求解
/*

f(n) = f(n -1) + g(n - 1)
g(n) = n*(n + 1) / 2 + 1 

so:    f(n) = f(n - 1) + (n - 1)*n/2 + 1
            = f(n - 2) + (n - 2)*(n - 1)/2 + 1 + (n - 1)*n/2 + 1
            ......
            = f(1) + 1*2/2 + 2*3/2 + 3*4/2 + 4*5/2 +.....+(n-1)*n/2 + (n-1)
            =  2 + (1*2 + 2*3 + 3*4 +......+ (n-1)*n) / 2 + (n - 1)
            =  2 + (1 + 2^2 -2 + 3^3 - 3 + 4^4 -4 +.......+ (n-1)^2 - n -1) / 2 + n + 1
            =  (1 + 2^2 + 3^2 + 4^2 + ..... + n^2 -1 -2 -3 -......-n) / 2 + n + 1
            = (n^3 +5n) / 6 + 1
*/


#include <stdio.h>

int main()
{
    int n;

    while (~scanf("%d", &n))
    {
		printf("%d\n", (n*n*n +5*n) / 6 + 1);
    }

    return 0;
}

 
 
 
    
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章