1. 程式人生 > >HDU2013 蟠桃記【遞推】

HDU2013 蟠桃記【遞推】

蟠桃記

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


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

Input 輸入資料有多組,每組佔一行,包含一個正整數n(1<n<30),表示只剩下一個桃子的時候是在第n天發生的。
Output 對於每組輸入資料,輸出第一天開始吃的時候桃子的總數,每個測試例項佔一行。
Sample Input 2 4
Sample Output 4 22
Author lcy
Source

問題簡述

:參見上述連結。

問題分析

  這是一個遞推問題,需要經過分析給出遞推式或遞推函式。只要有了遞推式或遞推函式問題就解決了。程式可以用遞迴函式實現,也可以用遞推計算實現。

  這裡給出的是遞推計算過程。一般而言,遞推計算過程的效率要優於遞迴。

  根據題意有f(n)/2-1 = f(n-1),整理後f(n) = 2 * ( f(n-1) + 1 ),另外f(1)=1。這就是遞推關係。

程式說明(略)。

題記

  這個問題有似曾相識的感覺,參見:桃子到底有多少。還有很多這樣的問題,本質上是同一個問題。

AC的C語言程式如下:

/* HDU2013 蟠桃記 */

/*
 * 分析問題可以得出以下的遞推函式:
 * f(1) = 1                   n=1
 * f(n) = 2 * ( f(n-1) + 1 )  n>1
 *
 */

#include <stdio.h>

int peach(int n) {
    if(n == 1)
        return 1;
    else {
        long res = 1L;
        while(--n)
            res = 2 * (res + 1);
        return res;
    }
}

int main(void)
{
    int n;

    while(scanf("%d", &n) != EOF)
        printf("%d\n", peach(n));

    return 0;
}