-
如果發現有些數字題目需要處理的資料多,而且單個數處理數字計數時會隨著數的變大越來越麻煩(通常都這樣),就適合這種方法或者這種思想解決問題。
因為通常遇到這方面的題目通常會考察乙個連續區間內符合某條件的數,這樣可以將單個數的位操作合一,直接看題目條件內所有的數的條件符合情況,即直接處理所有數可能的所有位以計算所有位的數可能出現的情況,在將題目給出的資料或資料範圍的邊界值對應後得到題目要求的結果。
求不大於n的所有數在2進製小包含k個1的數個數(原題是不大於n的可以用k個不相等的2的冪表示的數)
void
init()
//預處理dp陣列得到int型別所有數
}intst(
int n,
int k)
//求不大於x的數中二進位制下包含k個1的數個數if(
1<<
(i-1
)<=x)
ans+
=dp[i-1]
[k-tot];}
if(tot+x==k)
/*可以判斷x本身是不是符合要求,
這裡tot大於k則ans不變,小於k則x必為0,只有
tot等於k時只要x等於0就說明x自身也可滿足*/
ans++
;return ans;
}
-
而其實,在從左到右碰到乙個「1」後,其實就是看後面的能不能出現k-tot個「1」而與原數後面是什麼沒關係,因為當前位置零後就與後面沒什麼關係了。所以直接排列組合也可以的。
這個是二進位制下的,而如果其它進製下的,那就把原數在其它進製下的形式左起第乙個大於1的數和後面所有數都置為1再做就好了(其實這裡可能就不是31了,不過其它進製數字只會更少)。
不過解決問題並不是都要換算二進位制解決有些問題在原先(一般10)進製下就能夠解決,但基本思路差別不大,都是根據給定的數(或範圍的邊界值)按位進行dp得到解。
動態規劃 數字DPwindy
include include include using namespace std define ll long long const int maxn 2e9 10 ll f 20 20 設f i,j 表示由前i位數字構成且最高位數字為j的windy數有多少個 ll a 20 void ini...
解碼數字 動態規劃
題意 a用1表示,b用2表示,z用26表示 請問對給定的一串數字,說明有幾種解碼成字母的方式。例如,123可解碼成abc,lc,aw三種方式。分析 此問題有最右子問題,即如果當前位i和前一位i 1能組成小於等於26的兩位數,那麼前i個數字的解碼方式等於前i 2個數字的解碼方式加上前i 1個數字的解碼...
演算法 動態規劃 數字DP Leo Jose
我leo jose終於會用markdown寫部落格了 數字dp是一種計數用的dp,用來統計乙個區間 left,right 內滿足某些條件的數的個數。所謂數字dp,字面意思就是在數字上進行dp 實質就是優雅一點的暴力列舉,使其滿足dp的性質,然後記憶化 對於乙個求區間中滿足條件數的個數,最簡單暴力如下...