題目【問題描述】
小明想知道,滿足以下條件的正整數序列的數量:
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 求最優解 回溯...