遞推問題合集

2021-10-04 16:58:08 字數 1027 閱讀 4024

首先講一道小時候的遞推問題,如上所示,這裡,凡是問到第n次的時候,有幾種方式或者需要走幾步,就應該想到遞推地方法了。首先求出f(1)=1,f(2)=2。這時候想求f(3),這時候想,第一步可以走一步,或者兩步,如果走一步的話,還有兩步可以走,那麼恰好就是f(2)種情況。如果走兩步的話,還剩一步,那麼恰好就是f(1)種方法,所以f(3)=f(1)+f(2)=3。由此類推,f(n)=f(n-1)+f(n-2)。

接下來再說一道題,就是有n個信封,n封信,恰好每一封信都放錯信封有多少種情況。

假設每一封信都是正確放置的,現在考慮第a封信取出來,可以放到n-1個其他的信封上錯位。假設此時選擇的是第m個信封,把信a放到信封m裡,把信m拿出來,在放到其他n-1個信封裡(包含信封a)。此時可分為兩種情況,第一種,放到信封a中,那麼相當於信封a和信封b裡面的信互換,其它信封都是正確放置的,此時又回到了原點,相當於求n-2個信封錯位的種類,即(n-1)*f(n-2)種。第二種情況,此時信m不能放到信封a中,只能放到剩下的n-2封信裡面,那麼此時,不能放到信封a中的信m不就相當於信a嗎?那麼就有約等於n-1封信進行錯排的情況,即f(n-1),那麼第二種情況就有(n-1)*f(n-1)種。

最後求得錯排公式:(n-1)*(f(n-1)+f(n-2))種。

來看看上面兩題的例題。

第一題題目:

**:

#include using namespace std;

int floor(int n) //雖然這題用int也能實現,但還是建議用long long來存,防止所求的數過大。

if(n == 2)

return floor(n-1) + floor(n-2);

}int main()

if(n == 2)

return (n-1)*(floor(n-1) + floor(n-2));

}int main()

return 0;

}

學習筆記 遞推問題選講

要將a上所有圓盤移到c,並且過程中不能出現大的圓盤在小的圓盤上面的情況.把除了最大的之外的圓盤從a移到b.f n 1 把最大的從a移到c.1 把除了最大的之外的圓盤從b移到c.f n 1 通式 f n f n 1 times2 1 求用對角線將n邊形劃分成 n 2 個三角形的不同的方案數.通式 f ...

數塔問題 動態規劃問題 遞推問題

圖是乙個數塔,要求找出一條路徑,使路徑上的陣列和最大 第一行是乙個整數n,表示數塔的高度,接下來用n行數字表示數塔,其中第i行有i個整數,且所有的整數均在區間 0,99 內 output 輸出可能得到的最大和 sample input 57 3 88 1 0 2 7 4 4 4 5 2 6 5 sa...

遞推問題之馬踏過河卒問題

problem 棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n,m n,m為不超過15的整數 同樣馬的位置座標是需要給出的...