蓝桥杯 - 序列计数(记忆化搜索)
問題描述
小明想知道,滿足以下條件的正整數(shù)序列的數(shù)量:
1. 第一項(xiàng)為 n;
2. 第二項(xiàng)不超過 n;
3. 從第三項(xiàng)開始,每一項(xiàng)小于前兩項(xiàng)的差的絕對(duì)值。
請(qǐng)計(jì)算,對(duì)于給定的 n,有多少種滿足條件的序列。
輸入格式
輸入一行包含一個(gè)整數(shù) n。
輸出格式
輸出一個(gè)整數(shù),表示答案。答案可能很大,請(qǐng)輸出答案除以10000的余數(shù)。
樣例輸入
4
樣例輸出
7
樣例說明
以下是滿足條件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4
評(píng)測(cè)用例規(guī)模與約定
對(duì)于 20% 的評(píng)測(cè)用例,1 <= n <= 5;
對(duì)于 50% 的評(píng)測(cè)用例,1 <= n <= 10;
對(duì)于 80% 的評(píng)測(cè)用例,1 <= n <= 100;
對(duì)于所有評(píng)測(cè)用例,1 <= n <= 1000。
題目分析:模擬賽的時(shí)候看到n很小,并且自己也只會(huì)n^3的記憶化搜索,就直接暴力打了個(gè)表交上去了,因?yàn)轭}目強(qiáng)調(diào)了當(dāng)前項(xiàng)和上一項(xiàng)之間的關(guān)系,所以 dp[ i ][ j ] 代表的就是前一項(xiàng)為 i ,當(dāng)前項(xiàng)為 j 時(shí)的方案數(shù),這樣在dfs里再套一層for就很簡(jiǎn)單的寫出來了,n^3的方法就不多說了
重點(diǎn)是如何優(yōu)化為 n^2 的算法,因?yàn)?dp[ i ][ j ] 的兩維是無法優(yōu)化的了,可以著手考慮的是每次dfs里的那一層for循環(huán)能否優(yōu)化掉,這里就可以借助前綴和的思想了,將 dp[ i ][ j ] 所表示的意義轉(zhuǎn)換為:前一項(xiàng)為 i ,當(dāng)前項(xiàng)為 [ 1 , j ] 時(shí)的方案數(shù),這樣最后的答案從先前的變?yōu)榱?dp[ n ][ n ] ,轉(zhuǎn)移方程也比較巧妙(我自己反正推不出來):
dp[ i?][ j ] = dp[ i ][ j - 1 ] + dp[ j ][ abs( i - j ) - 1 ] + 1
如何理解呢,因?yàn)?dp[ i ][ j ] 的意義轉(zhuǎn)換為了前綴和的思想,所以 dp[ i ][ j ] 在前一項(xiàng)固定的基礎(chǔ)上,應(yīng)該是從當(dāng)前項(xiàng)為 j - 1 時(shí)轉(zhuǎn)移而來,加上 前一項(xiàng)為 i ,當(dāng)前項(xiàng)為 j 時(shí)的方案數(shù)就是 dp[ i ][ j ] 了,最后加上一是因?yàn)楸旧韺?duì)答案也有貢獻(xiàn),而前一項(xiàng)為 i ,當(dāng)前項(xiàng)為 j 的答案,就可以利用題目給出的絕對(duì)值之差這個(gè)條件約束了,妙啊
動(dòng)態(tài)規(guī)劃的題目一般都是只可意會(huì)不可言談。。
代碼:
?
?
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯 - 序列计数(记忆化搜索)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客 - 膜法记录(状压dp预处理)
- 下一篇: CodeForces - 1328D C