1. 程式人生 > 實用技巧 >數位dp之f(x)

數位dp之f(x)

HDU - 4734

題目大致意思:我們定義十進位制數x的權值為f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十進位制數x中第i位的數字。   

題目給出a,b,求出0~b有多少個不大於f(a)的數。

這個f(x)計算就和數位計算是一樣的,就是加了權值,所以dp[pos][sum],這狀態是基本的。a是題目給定的,f(a)是

變化的不過f(a)最大好像是4600的樣子。如果要memset優化就要加一維存f(a)的不同取值,那 就是dp[10][4600][4600],這顯然不合法。

這個時候就要用減法了,dp[pos][sum],sum不是存當前列舉的數的字首和(加權的),而是列舉到當前pos位,後面還需要湊sum的權值和的個數,
也就是說初始的是時候sum是f(a),列舉一位就減去這一位在計算f(i)的權值,那麼最後列舉完所有位 sum>=0時就是滿足的,後面的位數湊足sum位就可以了。
仔細想想這個狀態是與f(a)無關的,一個狀態只有在sum>=0時才滿足,如果我們按常規的思想求f(i)的話,那麼最後sum>=f(a)才是滿足的條件。(題目解釋來源 https://blog.csdn.net/wust_zzwh/article/details/52100392 )

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int fx;int l;
int a[20];
int dp[20][5500];
int dfs(int pos,int sum,bool lim){
    if(pos<=0)
        return sum>=0;
    if(sum<0)
        return 0;
    if(!lim&&dp[pos][sum]!=-1
) return dp[pos][sum]; int up = lim ? a[pos] : 9; int ans = 0; for (int i = 0; i <= up;i++){ int sum1 = i*(1<<(pos-1)); ans += dfs(pos - 1, sum-sum1, lim && i == up); } if(!lim) dp[pos][sum] = ans; return ans; } int solve(int x){ int cnt = 1; while(l){ int t = l % 10; l = l / 10; fx += cnt * t; cnt *= 2; } int pos = 0; while(x){ a[++pos] = x % 10; x /= 10; } return dfs(pos, fx, true); } int main(){ int t; scanf("%d", &t); memset(dp, -1, sizeof dp); for(int i=1;i<=t;i++){ int r; scanf("%d%d", &l, &r); fx = 0; printf("Case #%d: %d\n",i, solve(r)); } }//數位dp是從高位到低位

祝各位大佬身體健康,ac愉快。

 1 /**********/**********/**********//**********//**********//**********//**********/  
 2 <!--
 3                        ::
 4                       :;J7, :,                        ::;7:
 5                       ,ivYi, ,                       ;LLLFS:
 6                       :iv7Yi                       :7ri;j5PL
 7                      ,:ivYLvr                    ,ivrrirrY2X,
 8                      :;[email protected]:                :ivu@kexianli.
 9                     :iL7::,:::iiirii:ii;::::,,irvF7rvvLujL7ur
10                    ri::,:,::i:iiiiiii:i:irrv177JX7rYXqZEkvv17
11                 ;i:, , ::::iirrririi:i:::iiir2XXvii;L8OGJr71i
12               :,, ,,:   ,::[email protected]:i:::j1jri7ZBOS7ivv,
13                  ,::,    ::rv77iiiriii:iii:i::,[email protected]
14              ,,      ,, ,:ir7ir::,:::i;ir:::i:i::rSGGYri712:
15            :::  ,v7r:: ::rrv77:, ,, ,:i7rrii:::::, ir7ri7Lri
16           ,     2OBBOi,iiir;r::        ,irriiii::,, ,iv7Luur:
17         ,,     i78MBBi,:,:::,:,  :7FSL: ,iriii:::i::,,:rLqXv::
18         :      iuMMP: :,:::,:ii;2GY7OBB0viiii:i:iii:i:::iJqL;::
19        ,     ::::i   ,,,,, ::LuBBu BBBBBErii:i:i:i:i:i:i:r77ii
20       ,       :       , ,,:::rruBZ1MBBqi, :,,,:::,::::::iiriri:
21      ,               ,,,,::::i:  @arqiao.       ,:,, ,:::ii;i7:
22     :,       rjujLYLi   ,,:::::,:::::::::,,   ,:i,:,,,,,::i:iii
23     ::      BBBBBBBBB0,    ,,::: , ,:::::: ,      ,,,, ,,:::::::
24     i,  ,  ,8BMMBBBBBBi     ,,:,,     ,,, , ,   , , , :,::ii::i::
25     :      iZMOMOMBBM2::::::::::,,,,     ,,,,,,:,,,::::i:irr:i:::,
26     i   ,,:;u0MBMOG1L:::i::::::  ,,,::,   ,,, ::::::i:i:iirii:i:i:
27     :    ,iuUuuXUkFu7i:iii:i:::, :,:,: ::::::::i:i:::::iirr7iiri::
28     :     :[email protected]:::::, ,:ii:::::::i:::::i::,::::iirrriiiri::,
29      :      5BMBBBBBBSr:,::rv2kuii:::iii::,:i:,, , ,,:,:i@petermu.,
30           , :r50EZ8MBBBBGOBBBZP7::::i::,:::::,: :,:,::i;rrririiii::
31               :jujYY7LS0ujJL7r::,::i::,::::::::::::::iirirrrrrrr:ii:
32            ,:  :@kevensun.:,:,,,::::i:i:::::,,::::::iir;ii;7v77;ii;i,
33            ,,,     ,,:,::::::i:iiiii:i::::,, ::::[email protected];7:i,
34         , , ,,,:,,::::::::iiiiiiiiii:,:,:::::::::iiir;ri7vL77rrirri::
35          :,, , ::::::::i:::i:::i:i::,,,,,:,::i:i:::iir;@Secbone.ii:::
36 
37 --
38 
39 
40 /**
41  
View Code