數字dp HDU 4734 F x 減法優化

2021-09-25 01:47:39 字數 974 閱讀 4443

題目大意:

定義對於乙個樣例輸入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(a)-sum來表示第二維狀態。那麼:ans表示到pos位, f(i) <=ans的個數, 就是下面的數的f(i)<=ans的i的個數。這個跟f(a)是無關的。

#include

#define ll long long

using

namespace std;

int all;

//f(a)

int a[15]

;int dp[15]

[100005];

intf

(int x)

int ans=

f(x/10)

;return ans*2+

(x%10);

}int

dfs(

int pos,

int sum,

bool mt)

if(sum>all)

//可行性剪枝if(

!mt&&dp[pos]

[all-sum]!=-

1)int len=mt?a[pos]:9

;int ans=0;

for(

int i=

0;i<=len;i++)if

(!mt)

return ans;

}int

slove

(int x)

return

dfs(pos-1,

0,true);

}int

main()

return0;

}

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

HDU 4734 基礎數字dp(遞推)

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

HDU4734,F x (數字DP 優化)

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