zoukankan      html  css  js  c++  java
  • 数位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 )(感觉自己解释解释不清楚,所以……,不好意思 wtcl)。

    #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
    ",i, solve(r));
        }
    }//数位dp是从高位到低位

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

     1 /**********/**********/**********//**********//**********//**********//**********/  
     2 <!--
     3                        ::
     4                       :;J7, :,                        ::;7:
     5                       ,ivYi, ,                       ;LLLFS:
     6                       :iv7Yi                       :7ri;j5PL
     7                      ,:ivYLvr                    ,ivrrirrY2X,
     8                      :;r@Wwz.7r:                :ivu@kexianli.
     9                     :iL7::,:::iiirii:ii;::::,,irvF7rvvLujL7ur
    10                    ri::,:,::i:iiiiiii:i:irrv177JX7rYXqZEkvv17
    11                 ;i:, , ::::iirrririi:i:::iiir2XXvii;L8OGJr71i
    12               :,, ,,:   ,::ir@mingyi.irii:i:::j1jri7ZBOS7ivv,
    13                  ,::,    ::rv77iiiriii:iii:i::,rvLq@huhao.Li
    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     :     :rk@Yizero.i:::::, ,: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::::,, ::::iiiir@xingjief.r;7:i,
    34         , , ,,,:,,::::::::iiiiiiiiii:,:,:::::::::iiir;ri7vL77rrirri::
    35          :,, , ::::::::i:::i:::i:i::,,,,,:,::i:i:::iir;@Secbone.ii:::
    36 
    37 --
    38 
    39 
    40 /**
    41  
    View Code
  • 相关阅读:
    数据库结构中的"树"
    Jquery学习
    cms系统也不复杂
    让你的博客园变灰
    IList对象排序方法
    计算机简介(二)
    在同一台电脑上使用U盘时快时慢的解决方法
    计算机简介
    合并排序
    javascript小结
  • 原文地址:https://www.cnblogs.com/kitalekita/p/13392990.html
Copyright © 2011-2022 走看看