藍橋杯 序列計數 記憶化搜尋

2021-10-04 10:23:42 字數 1450 閱讀 4675

問題描述

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

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...