數字DP 好數(jzoj 1521)

2021-09-25 00:21:12 字數 1021 閱讀 4642

定義好數為轉換為二進位制後,有至少三個連續的位相同的數,現在要求乙個範圍內的好數個數

對於50%測試,0 <= low <= up <= 100000。

我們可以用字首和來求,就把問題轉換為了前n個數中好數的個數

它讓我們求好數,但因為好數特別難求,所以我們可以求『壞數』,就是沒有連續三個位是一樣的數

我們先用數字dp求出多少位以什麼開頭的壞數總數

然後我們把他分位數小於n的位數的和等於n的位數的

小於的:

我們就可以直接用已經求出來的壞數總數,然後分為不同位數的直接加就行了

如1…1100100先分為1位,2位,3位,4位,5位,6位的型別

等於的:

就從大到小把1變成0,這樣就一定小於n了,然後分別計算

最後還要計算n

然後用n減去壞數的個數就得到了好數的個數了

#include

#include

#include

#define ll long long

using

namespace std;

ll a,b,s[40]

,f[40][

5][5

];ll js

(ll now)

}return sum;

}ll ans

(ll dep)

intmain()

scanf

("%lld %lld"

,&a,

&b);

printf

("%lld"

,ans

(b)-

ans(a-1)

);//字首和求職

}

JZOJ 數字遊戲 DP

小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,a3,an,然後給你m個回合的機會,每回合你可以從中選擇乙個數字擦去它,接著剩下來的每個數字ai都要遞減乙個值bi,即a1減掉b1,a2減掉b2,如此重複m個回合,所有你擦去的數字之和就是你所得的分數。小w和他的好朋友小y玩了這個遊戲,可是他發...

jzoj數字遊戲 貪心 DP

description 一行數字a1,a2,a3,an,有m個回合,每個回合必須從中選擇乙個數字擦去它,接著每個回合後剩下來的每個數字ai都要遞減乙個相應的值bi。如此重複m個回合,所有你擦去的數字之和就是你所得的分數。給出n,m,a數列和b數列,求所得的最多的分數。input 輸入檔案的第一行是乙...

DP 數字遊戲(jzoj 2131)

有n個數,每個數有相應的a ia i ai 和b ib i bi 當選了乙個數後結果加上a ia i ai 其他數分別減去他們自己的a ja j aj 現在讓你選m個數,結果最大是多少 3 310 20 30 4 5 6471 m n 2000 1 leqslant m leqslant n leq...