如果設step(n)表示n減到0的最小操作次數,顯然step有單調性。
我們設f[mx,n]表示把n減到0的最小操作次數,mx表示的是比n最高位還高的那些位的最大值。
現在我們可以固定最高位,把剩餘位減到0,也就是遞迴計算,返回二元組(cost,dp)表示操作次數為cost,最終還可以額外減掉乙個dp。
例如21,做下去會返回(1,1),也就是變成20後還能額外減掉乙個1變為19。
做到最末位時,直接減掉最大值。
然後記憶化搜尋即可,具體見**實現。
注意爆long long的問題。
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
#define cost first
#define dp second
using
namespace
std;
typedef
long
long ll;
typedef pairdong;
map f;
ll n;
dong dfs(ll mx,ll n)
int main()
4665 小w的喜糖
求數字可重的錯排。考慮2 n2 n 2n容斥,列舉哪些位一樣,就是 t s 1 t n t ai bi sum 1 frac t s 1 t ai bi n t 其中b ib i bi 為每種顏色已用個數。考慮dp這個式子,f i j f i j f i j 表示前i種顏色,用了j個,式子下面逆元積...
小w的a b問題
大家一定都做過各大oj上面不同版本的a b problem,如果現在反過來給你c,請你給我輸出一組a和b,使得a b的和等於c呢?這同樣還是乙個簡單的問題。我們假設某種語言中的32位整形被定義成int 型別,該語言中負整數以二進位制補碼的形式儲存,第32位為符號位,前31位為數值位。例如 1就被儲存...
小w的魔術撲克
這道題的關鍵,就是將題目轉化為圖論。我們將每張牌的正反兩面的數值連一條邊,可以發現,我們只能在一棵樹中選n 1個點。那麼就意味著,當乙個詢問包含一整棵樹時,這是不可能的 因為是用數值做編號,可以發現乙個點只可能出現在一棵樹中 那麼如何實現呢?我們處理出每棵樹的min和max,自然,樹的其他所有節點都...