題解 HDU 4734 F x (數字DP)

2022-05-01 21:18:08 字數 1147 閱讀 5327

這道題還是關於數字dp的板子題

數字dp有乙個顯著的特徵,就是求的東西大概率與輸入關係不大,理論上一般都是數的構成規律

然後這題就是算乙個\( f(a) \)的公式值,然後求\( \left [ 0 ,  b \right ] \)區間內\( f(x) \)不大於\( f(a) \)的數的個數

所以由資料範圍很容易得到計算出最大值不會超過4600

然後我們設狀態\( dp[10][4600][4600] \)表示不同\( f(a) \)取值下的第\( pos \)個位置的值總和為 \( sumx \)的 數的個數

顯然會mle

這時候可以用減法轉換狀態

用\( dp[10][4600] \)表示到了第\( pos \)個位置,還要湊\( sumx \)的值的數的個數

然後就可以發現乙個現象,這個狀態與\( f(a) \)無關的

然後就可做了

注意乙個事情,就是求的是不大於\( f(a) \)的數的個數

所以最後\( sumx \ge 0 \)就是合法狀態了

#include #include 

#include

using

namespace

std;

int dp[10][4600],a[10

];int dfs(int pos,int limit,int

state)

if(!limit&&dp[pos][state]!=-1

)

return

dp[pos][state];

int mid=0,up=limit?a[pos]:9;

for(int i=0;i<=up;i++)

if(!limit)

dp[pos][state]=mid;

return

mid;

}int solve(int a,int

x)

int con=0

; memset(a,

0,sizeof

(a));

while

(x)

return dfs(con-1,true

,fa);

}int

main()

return0;

}

HDU4734,F x (數字DP 優化)

本題思路和dp狀態不難求,比較難的是該怎麼優化。數字dp的優化可參考下面的部落格 簡單的說,一般數字dp的優化有兩種方法 將memset放置在多組資料外面,即程式每執行一次只需memset一次,這種方法要求,題目所給的約束條件是每個數本身的屬性,與輸入無關。相減,這種方法是稍微改變一下狀態,使得題目...

HDU 4734 基礎數字dp(遞推)

以前成都賽區的題目。題意很明顯,就是有乙個f x 的函式,然後給你乙個a和b求出在0 b中有多少小於等於f a 的,預處理出來dp i j k 中有多少小於等於k的。這裡採用遞推。因為我太弱了。遞迴總是寫錯。還需慢慢加深理解。ps.很醜。還是推薦遞迴。實在不會遞推也可以。蒟蒻加油!include i...

HDU 4734 基礎數字dp(遞推)

以前成都賽區的題目。題意很明顯,就是有乙個f x 的函式,然後給你乙個a和b求出在0 b中有多少小於等於f a 的,預處理出來dp i j k 中有多少小於等於k的。這裡採用遞推。因為我太弱了。遞迴總是寫錯。還需慢慢加深理解。ps.很醜。還是推薦遞迴。實在不會遞推也可以。蒟蒻加油!include i...