HDU4734,F x (數字DP 優化)

2021-09-25 22:54:27 字數 1031 閱讀 7103

本題思路和dp狀態不難求,比較難的是該怎麼優化。

數字dp的優化可參考下面的部落格:

簡單的說,一般數字dp的優化有兩種方法:

①將memset放置在多組資料外面,即程式每執行一次只需memset一次,這種方法要求,題目所給的約束條件是每個數本身的屬性,與輸入無關。

②相減,這種方法是稍微改變一下狀態,使得題目的約束條件轉化為數本身的屬性,從而呼叫方法①來對時間進行優化。

本題就是採用②。剛開始不難想出,dp的狀態可以是dp[pos][sum],表示列舉到第pos位時,前面的數字的總權值為sum,滿足條件的數就是最終sum>=f(a)即可。但是這麼做的話每輸入乙個樣例都要memset一次。於是,考慮到對於每個數的總權值本身也是固定的,屬於它本身的屬性,因此我們可以稍微改變一下dp狀態:

dp[pos][sum]表示列舉到第pos位時,還需湊權值為sum的數字的個數。即一開始sum初始為f(a),每列舉一位,就用sum減去相應權值就可以了,不難想出,這麼處理之後,dp狀態就與f(a)無關了,因此現在就可以採用①方法了

**如下:

#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=1e5+5;

const int inf=0x3f3f3f3f;

ll dp[11][4601];

int digit[11],fa;

ll dfs(int pos,ll sum,ll base,bool limit)

if(!limit) dp[pos][sum]=ret;

return ret;

}ll solve(ll n)

ll base;

for(int i=0;i小結:當數字dp時間卡得很嚴時,可以設法將題目要求的約束條件轉化為數本身的屬性,從而對時間進行優化。

題解 HDU 4734 F x (數字DP)

這道題還是關於數字dp的板子題 數字dp有乙個顯著的特徵,就是求的東西大概率與輸入關係不大,理論上一般都是數的構成規律 然後這題就是算乙個 f a 的公式值,然後求 left 0 b right 區間內 f x 不大於 f a 的數的個數 所以由資料範圍很容易得到計算出最大值不會超過4600 然後我...

數字dp HDU 4734 F x 減法優化

題目大意 定義對於乙個樣例輸入a b.求 0,b 有多少個i使得 f i f a 我們用乙個sum來記錄當前列舉數的f值,當pos 1並且sum f a 那麼就return 1。這個狀態dp pos sum 是和f a 有關係的,所以對於不同的樣例,就必須mem一次。解決方法。我們用減法用ans f...

hdoj4734(數字dp優化)

題意 定義乙個十進位制數anan 1.a1的value為an 2n 1 a1 20,t組樣例 1e4 每組樣例給出a b,求出 0,b 中value小於等於a的value的數的個數。思路 數字dp,第一能想到將ai 2i 1的和作為狀態,即dp len sum 表示到長度為len的數中value為s...