数位dp之f(x)
Posted kitalekita
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数位dp之f(x)相关的知识,希望对你有一定的参考价值。
题目大致意思:我们定义十进制数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 ",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
以上是关于数位dp之f(x)的主要内容,如果未能解决你的问题,请参考以下文章