题意:(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)的数

#include <stdio.h>
#include <string.h> int mx[];
int dp[][]; /*   <数位DP>     所谓数位DP就是基于考虑数字的每一位来转移的DP。     例如求比456小的数,可以这么考虑,         4 5 6         4  5 (0~6)         4 (0~4) (0~9)         (0~3) (0~9) (0~9)     然后我们就可以考虑用dp[len][pre]表示长度为len,以pre开头的符合条件的数的个数。     这样就可以得到转移方程了。   而对于这道题,我们可以用dp[len][pre]表示长度为len且权值不大于pre的数。   这道题用记忆化搜索,除边界条件外记录dp[len][pre]的值,下一次发现以前已经计算过了就可以直接return;   初值:dp[len][pre] = 0;      dfs(len, pre, flag)表示求长度为len,不超过pre的所有符合条件的值。其中flag是用来控制边界的。      dfs过程中当深搜的边界,发现len < 0,pre >=0 的时候就返回1.
*/ int dfs(int len, int pre, bool flag)
{
if ( len < ) return pre >=;
if ( pre < ) return ; if ( !flag && dp[len][pre] != -) return dp[len][pre]; int end = flag?mx[len]:;
int ans = ;
int i;
for( i = ; i <= end; i++)
{
ans += dfs(len-, pre- i*(<<len), flag&&i==end);
} if( !flag )dp[len][pre] = ans;
return ans;
} int f(int x)
{
int ans = ;
int tmp = ; while( x )
{
ans += (x%)*tmp;
tmp = tmp*;
x = x/;
} return ans;
} int cal(int a, int b)
{
int tmp = ; while( b )
{
mx[ tmp++ ]= b%;
b = b/;
}
return dfs(tmp - , f(a), true );
} int main()
{
int t;
int a,b;
scanf("%d", &t);
memset(dp, 0xff, sizeof(dp));
for(int i = ; i <= t; i++ )
{
scanf("%d%d",&a, &b);
printf("Case #%d: %d\n", i, cal(a,b));
}
return ;
}

数位DP的更多相关文章

  1. 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP

    [BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...

  2. bzoj1026数位dp

    基础的数位dp 但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了) #include <bits/stdc++.h> using namespace ...

  3. uva12063数位dp

    辣鸡军训毁我青春!!! 因为在军训,导致很长时间都只能看书yy题目,而不能溜到机房鏼题 于是在猫大的帮助下我发现这道习题是数位dp 然后想起之前讲dp的时候一直在补作业所以没怎么写,然后就试了试 果然 ...

  4. HDU2089 不要62[数位DP]

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. 数位DP GYM 100827 E Hill Number

    题目链接 题意:判断小于n的数字中,数位从高到低成上升再下降的趋势的数字的个数 分析:简单的数位DP,保存前一位的数字,注意临界点的处理,都是套路. #include <bits/stdc++. ...

  6. 数位dp总结

    由简单到稍微难点. 从网上搜了10到数位dp的题目,有几道还是很难想到的,前几道基本都是模板题,供入门用. 点开即可看题解. hdu3555 Bomb hdu3652 B-number hdu2089 ...

  7. 数位DP入门

    HDU 2089 不要62 DESC: 问l, r范围内的没有4和相邻62的数有多少个. #include <stdio.h> #include <string.h> #inc ...

  8. 数位DP之奥义

    恩是的没错数位DP的奥义就是一个简练的dfs模板 int dfs(int position, int condition, bool boundary) { ) return (condition ? ...

  9. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

随机推荐

  1. unity3d 知识点随记

    1.transform.translate是增加transform面板相应的数值x,y,z是以本地坐标系为方向:transform.transformdirection是以世界坐标系为方向,可以去测试 ...

  2. select下拉框选中问题

    每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selector"></select&g ...

  3. eclipse或者myeclipse安装svn报错”unable to load default svn client”

    是svn版本低了的问题 subeclipse下载,直接百度site1.X                  X为你需要的版本 解压site1.X 将此窗口先放到一边 在eclipse的安装目录下的dr ...

  4. linux随笔2

    ---恢复内容开始--- 2016,12,20 在linux里面不写这些扩展名,也是可以的,但是写这些扩展名是为了个管理员写的,好区分,但是linux本身不依靠扩展名来区分文件类型 ~~~~~~~~~ ...

  5. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(二)kmeans

    (上接第二章) 4.3.1 KMeans 算法流程 算法的过程如下: (1)从N个数据文档随机选取K个文档作为质心 (2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类 (3)重新计 ...

  6. TCP数据包的封包和拆包

    //该段博文为引用,非原创. 封包和拆包 作者:fengge8ylf  博客:http://blog.csdn.net/fengge8ylf 对于基于TCP开发的通讯程序,有个很重要的问题需要解决,就 ...

  7. 关于display:flex

    遇到了一个bug 就是display:flex   遇到的bug原型就是,项目容器的diaplay:flex ,一行项目五个,到最后一行只剩两个的时候 是两端对齐的,如果再添加的话 也就是两端各一个子 ...

  8. setValue和setObject的区别

    在NSMutableDictionary的方法中有setValue forKey与setObject forKey,它们都可以用来设置某一个key值对应的value 1,setValue: forKe ...

  9. Zxing兼容2.3等低版本

    需要修改的地方 1.InactivityTimer.java public synchronized void onActivity() { ... if (Build.VERSION.SDK_INT ...

  10. Spring ioc容器

    一.ioc容器 ioc (inversion of  control)即控制反转,把某一个接口选择实现类的控制权转移给Spring容器来管理.调用类对该实现类的依赖关系由ioc容器注入(DI),传统的 ...