序列計數 記憶回溯法dfs 優化

2021-10-04 11:15:44 字數 1356 閱讀 8298

題目

【問題描述】

小明想知道,滿足以下條件的正整數序列的數量:

1. 第一項為 n;

2. 第二項不超過 n;

3. 從第三項開始,每一項小於前兩項的差的絕對值。

請計算,對於給定的 n,有多少種滿足條件的序列。

【輸入格式】

輸入一行包含乙個整數 n。

【輸出格式】

輸出乙個整數,表示答案。答案可能很大,請輸出答案除以10000的餘數。

【樣例輸入】

4【樣例輸出】

7【樣例說明】

以下是滿足條件的序列:

4 14 1 1

4 1 2

4 24 2 1

4 34 4

【評測用例規模與約定】

對於 20% 的評測用例,1 <= n <= 5;

對於 50% 的評測用例,1 <= n <= 10;

對於 80% 的評測用例,1 <= n <= 100;

對於所有評測用例,1 <= n <= 1000。

1.這題在定義正整數序列是就是按遞迴定義的,所以這樣的題在解決是一般也是用遞迴的方法解決,但是直接用遞推公式的話肯定會爆掉,所以要用記憶化陣列來優化。

2.下面先看遞推公式  q(pre,cur)=q(cur,1)+q(cur,2)+q(cur,3)+......+q(cur,abs(pre-cur)-1)+1

記憶化資料就是用乙個陣列來記錄已經遞迴過的,就比如a[4][1],它代表的意思就是第乙個數是4(對應遞推式中的pre),第二個數也是1(對應遞推式中的cur),

那第三個數就可以是1、2、3,所以q(4,1)=q(1,1)+q(1,2)+1.

3.題目題目裡面要求的是輸入乙個n,求他的正整數序列,所以可以寫乙個迴圈,把q(n,1)、q(n,2)...q(n,n)累加一塊就是所要求的,

#include#includeusing namespace std;

int n,sum;

int a[1005][1005];

int q(int pre,int cur)

int main()

序列計數(記憶化搜尋)(C )

問題描述 小明想知道,滿足以下條件的正整數序列的數量 第一項為 n 第二項不超過 n 從第三項開始,每一項小於前兩項的差的絕對值。請計算,對於給定的 n,有多少種滿足條件的序列。輸入格式 輸入一行包含乙個整數 n。輸出格式 輸出乙個整數,表示答案。答案可能很大,請輸出答案除以10000的餘數。樣例輸...

回溯法 n皇后問題 DFS

在n n的棋盤上放置彼此不受攻擊的n個皇后。按照西洋棋的規則,皇后可以攻擊與之在同一行,同一列,同一斜線上的棋子。現在在n n的棋盤上放置n個皇后,使彼此不受攻擊。在放置皇后的過程中,我們要考慮三個方面,不能同行,不能同列,不能同對角線。那麼就可以從行出發,即每個皇后放在一行中,這樣只需考慮與已放置...

回溯法或者遞迴或者DFS

判斷回溯很簡單,拿到乙個問題,你感覺如果不窮舉一下就沒法知道答案,那就可以開始回溯了。一般回溯的問題有三種 find a path to success 有沒有解 find all paths to success 求所有解 find the best path to success 求最優解 回溯...