題意:定義乙個十進位制數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為sum的數的個數,最後判斷sum<=value(a)來確定是否滿足條件。但是問題來了,我們會發現這樣的狀態與輸入a相關,而輸入有1e4組,時間限制為500ms,每次還都要memset(dp),顯然會超時。
這個時候就要優化,利用減法,dp[len][sum]表示長度len中value<=sum的數的個數,這一狀態性質是所有數共有的性質,與輸入a無關,因此可以儲存dp的值,而不用memset,最後的結果就是遞迴到最後一層的sum>=0的數的個數,即value<=value(a)。
ac**:
#include#includeusing
namespace
std;
int a[10],dp[10][4700
],t;
int gets(int
x)
return
ret;
}int dfs(int pos,int sum,bool
limit)
if(!limit) dp[pos][sum]=tmp;
return
tmp;
}int solve(int x,int
sum)
return dfs(pos-1,sum,true);}
intmain()
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 F x (數字DP)
這道題還是關於數字dp的板子題 數字dp有乙個顯著的特徵,就是求的東西大概率與輸入關係不大,理論上一般都是數的構成規律 然後這題就是算乙個 f a 的公式值,然後求 left 0 b right 區間內 f x 不大於 f a 的數的個數 所以由資料範圍很容易得到計算出最大值不會超過4600 然後我...