遞推之種蘿蔔

2021-08-18 18:52:58 字數 2224 閱讀 2780

描述

一農夫挖了n個坑,準備種蘿蔔,n個坑排成一條直線,農夫認為如果連續m個坑都放入蘿蔔種子,那麼就會影響蘿蔔的生長,所以某些坑中就不能放蘿蔔種子。

本題的任務是:對於給定的n和m,求不影響生長的種法的總數。

輸入一行兩個正整數n和m,之間用空格隔開

0≤n≤64 , 0≤m≤5輸出一行乙個正整數,表示正確種法的總數

樣例輸入

4 3
樣例輸出

13
提示找唄0個坑只有不種一種情況;1個坑要看m的情況

解題思路

很顯然這道題要使用遞推的方法來做。這道題的遞推式算是比較難想到的,我認為在做這種遞推時要分好情況。例如說這道種蘿蔔的題目分為三種情況如下:

1.n當坑數小於影響蘿蔔生長連續坑數時,想一想是不是隨便怎樣種都行?那如何推出此時的種法數和之前的種法數的關係呢?ok,由於現在n影響蘿蔔生長連續坑數為m時,是不是更加是隨便種都行?設此時的種法為f(n-1)(m),好,現在求遞推式的關鍵來了,看一下下面的圖你就懂了

當坑數為

n-1,影響蘿蔔生長連續坑數為m

時,合理的種法為

f(n-1)(m)

;當坑數為

n,影響蘿蔔生長連續坑數為m

時,是不是就是在

坑數為n-1

加了乙個第

n個坑?第

n個坑的情況為種與不種2

種情況,那是不是

f(n)(m)=2* f(n-1)(m)呢?

2.m=n

n=m時,也就是說

坑數和影響蘿蔔生長連續坑數相等時,是不是就是把n個坑全中滿這一種情況不行呀?此時我們的遞推公式是不是在所有種法的基礎上減去1就好了,即f(n)(m)=2* f(n-1)(m)-1;

3.n>m

n>m時,也就是說坑數大於

影響蘿蔔生長連續坑數時,這時的情況比較複雜。看一下下面的圖和文字。

假設現在n

個坑,而且為合理種法,那其種法為

2*f(n-1)(m)

;假設當增加

1個坑之後如果這個第n+1

個坑要種

,後面剛好成了

m個連續的坑,就成了不合理的種法。那這種不合理的種法應該有多少種呢?那是不是現在確定了

m-1個連續的坑都要種蘿蔔,而前面

n-m-1

個坑肯定是為合理種法,有

f(n-m-1)(m)

種,所以此時不合理的種法應f(n-m-1)(m)

種。那此時的合理種法應該為所有的種法減去不合理的種法f(n-m-1)(m)

,即f(n)(m)= 2*f(n-1)(m)- f(n-m-1)(m)

參考程式

#includeusing namespace std;

long long a[66][6];//陣列要定義成long long型,要不然到最後會爆

int main()

{ int n,m;

cin>>n>>m;

for(int i=0;i<=n;i++)

for(int j=0;j<=m;j++)

if(i==0)a[i][j]=1;//0個坑只有不種一種情況

else if(ij)a[i][j]=2*a[i-1][j]-a[i-1-j][j];//n>m:f(n)(m)= 2*f(n-1)(m)- f(n-m-1)(m)

cout<

種蘿蔔 種寂寞

歲末年初,農場遊戲突然在公司火了起來。我有乙個同事,本來是不太會電腦的,也忽然迷上了這個東西,基本上每天要打一次 催促我農場的蘿蔔該收了,趕緊種上新的好讓他去偷。還有乙個部門,本來是不能上網的,因為乙個特殊的機會被開放了,接下來情況就好玩兒了,每次經過那裡都會發現有人在農場忙著拾掇那點菜呢。最終的結...

種蘿蔔 種寂寞

歲末年初,農場遊戲突然在公司火了起來。我有乙個同事,本來是不太會電腦的,也忽然迷上了這個東西,基本上每天要打一次 催促我農場的蘿蔔該收了,趕緊種上新的好讓他去偷。還有乙個部門,本來是不能上網的,因為乙個特殊的機會被開放了,接下來情況就好玩兒了,每次經過那裡都會發現有人在農場忙著拾掇那點菜呢。最終的結...

9種基本演算法 遞推

遞推思想 利用某個已知的條件,利用特定關係逐步遞推,直到得到結構。順推法 從已知條件出發,逐步推算出要解決問題的方法。例如 斐波那契數列 逆推法 從已知結果出發,用迭代表示式逐步推算出問題開始的條件。例項 斐波那契數列 f n f n 1 f n 2 兔子出生2個月後就具有繁殖能力,一對兔子每個月能...