問題描述
小明想知道,滿足以下條件的正整數序列的數量:
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。
題目分析:模擬賽的時候看到n很小,並且自己也只會n^3的記憶化搜尋,就直接暴力打了個表交上去了,因為題目強調了當前項和上一項之間的關係,所以 dp[ i ][ j ] 代表的就是前一項為 i ,當前項為 j 時的方案數,這樣在dfs裡再套一層for就很簡單的寫出來了,n^3的方法就不多說了
重點是如何優化為 n^2 的演算法,因為 dp[ i ][ j ] 的兩維是無法優化的了,可以著手考慮的是每次dfs裡的那一層for迴圈能否優化掉,這裡就可以借助字首和的思想了,將 dp[ i ][ j ] 所表示的意義轉換為:前一項為 i ,當前項為 [ 1 , j ] 時的方案數,這樣最後的答案從先前的
如何理解呢,因為 dp[ i ][ j ] 的意義轉換為了字首和的思想,所以 dp[ i ][ j ] 在前一項固定的基礎上,應該是從當前項為 j - 1 時轉移而來,加上前一項為 i ,當前項為 j時的方案數就是 dp[ i ][ j ] 了,最後加上一是因為本身對答案也有貢獻,而前一項為 i ,當前項為 j 的答案,就可以利用題目給出的絕對值之差這個條件約束了,妙啊
動態規劃的題目一般都是只可意會不可言談。。
**:
#include#include#include#include#include#include#include#include#include#include#include//#include#includeusing namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int n=1e3+100;
const int mod=10000;
int dp[n][n];
int dfs(int pre,int cur)
int main()
序列計數(記憶化搜尋)(C )
問題描述 小明想知道,滿足以下條件的正整數序列的數量 第一項為 n 第二項不超過 n 從第三項開始,每一項小於前兩項的差的絕對值。請計算,對於給定的 n,有多少種滿足條件的序列。輸入格式 輸入一行包含乙個整數 n。輸出格式 輸出乙個整數,表示答案。答案可能很大,請輸出答案除以10000的餘數。樣例輸...
藍橋杯 ALGO 122(記憶化搜尋)
演算法訓練 未名湖邊的煩惱 時間限制 1.0s 記憶體限制 256.0mb 問題描述 每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排...
藍橋杯 地宮取寶 (記憶化搜尋)
思路 記憶化搜尋,dp x y curmax num 記錄的是要取 x,y 位置時,拿了num個物品,其中最大價值為curmax的 時 候的方案數量。注意有個坑點,物品價值可能為0,搜尋時我們初始價值為0,但第乙個價值為0的物品是可以取的,所以我們讀入時 講 所有物品價值 1.include inc...