題目大意:給出四個(gè)整數(shù) A , B , K , W ,問(wèn)滿足下列條件的二元對(duì)的個(gè)數(shù):
x , y 是整數(shù)
x <= A , y <= B
abs( x - y ) <= K
x xor y <= W
題目分析:數(shù)位dp,如果按照二進(jìn)制進(jìn)行數(shù)位的話,除了第三個(gè)條件都比較容易實(shí)現(xiàn),所以對(duì)第三個(gè)條件進(jìn)行以下轉(zhuǎn)換,abs( x - y ) <= K ,去掉絕對(duì)值的話就能轉(zhuǎn)換為 x - y <= K && y - x <= K?,移一下項(xiàng)就是 x - y + K >= 0 && y - x + K >= 0,這樣我們現(xiàn)在就得到了五個(gè)條件,作為數(shù)位dp的五個(gè)狀態(tài):
f1:代表 x <= A
f1 == 0:x < A
f1 == 1:x = A
f2:代表 y <= B
f2 == 0:y < B
f2 == 1:y = B
f3:代表 x xor y <= W
f3 == 0:x xor y < W
f3 == 1:x xor y = W
v1:代表?x - y + K,v2:代表 y - x + K,取值為 -1 , 0 , 1
重點(diǎn)解釋一下 v1 和 v2 的三個(gè)狀態(tài)吧,為什么要分成 -1 , 0 和 1 討論,因?yàn)檎麄€(gè)操作是在二進(jìn)制下進(jìn)行運(yùn)算的,所以 x , y , K ,都只能取 0 或 1 ,那么對(duì)于其中某一位的運(yùn)算來(lái)說(shuō),以 x - y + K?為例,其整體的最大值為 2 ,整體的最小值為 -1,又因?yàn)槭菑母呶坏降臀贿M(jìn)行的狀態(tài)轉(zhuǎn)移,每次得到的 v1 和 v2,傳遞到低位時(shí),需要乘以進(jìn)制,也就是需要乘以 2 才能換算為低位的實(shí)際數(shù)值,那么分類(lèi)討論一下:
上一次傳下來(lái)的 v1 小于等于 -2:乘以 2 后此時(shí) x - y + K 的值為 -4,無(wú)論如何取值都無(wú)法中和,越往下將會(huì)欠的越多,永遠(yuǎn)無(wú)法到達(dá) v1 >= 0 的狀態(tài)了
上一次傳下來(lái)的 v1 等于 -1:乘以 2 后此時(shí)?x - y + K 的值為 -2 ,還有被中和為 0 的機(jī)會(huì)
上一次傳下來(lái)的 v1 等于 0:顯然是一個(gè)合法狀態(tài)
上一次傳下來(lái)的 v1 大于等于 1:乘以 2 后此時(shí) x - y + K 的值為 2,下面無(wú)論如何取值,x - y + K 的值都肯定滿足 v1 >= 0 的條件了,所以大于等于 1 的狀態(tài)都將其歸類(lèi)為 1 的狀態(tài)即可,能節(jié)省大量空間