题意

题目就是说让我们在l到r的数字中求得有多少个连续k为不相同的数
1≤L≤R≤1e18
2≤K≤5
Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

分析

直接枚举必然超时 考虑数位dp
由于k最大到5 所以我们可以记录前四位的大小 通过一个check函数去判断是否存在相同的数
也就是说 状态转移发生在前四位对应的数字大小的情况下
我们开一个dp[pos][p1][p2][p3][p4]记录在pos下前四位分别是p1,p2,p3,p4的符合条件的数的个数
然后每次搞完后记录下来(没有限制) 我们的dp数组中只记录没有限制的数 如果有限制就不记录只是求和
如何判断前四位是否与本位相同 我们可以把前导0用10表示 如果前面的位数是10表示前面的数是0

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans,l,r,k,dp[20][11][11][11][11],d[20],dig;
bool check(int p4,int p3,int p2,int p1,int x){if(k==2&&p1!=10)return x!=p1;else if(k==3)return (x!=p1&&x!=p2);else if(k==4)return (x!=p1&&x!=p2&&x!=p3);else return (x!=p1&&x!=p2&&x!=p3&&x!=p4);
}
ll DP(int pos,int p4,int p3,int p2,int p1,bool limit){if(pos==0){return p1!=10;}//3 这里的意义在于如果这个数是个0 就不记录他//每次走到了pos==0的时候  因为走到这里的数 只可能是1个确切的数 px都已经确定if(!limit&&~dp[pos][p4][p3][p2][p1])return dp[pos][p4][p3][p2][p1];//如果没有限制 且已经记录过 直接返回结果int up = limit?d[pos]:9;//确认上界ll a=0;for(int i=0;i<=up;i++){//pos位置下 从小到大数位枚举 把每一位下的分结果计算出来if(p1==10&&i==0)//前导零情况a+=DP(pos-1,10,10,10,10,limit&&i==up);//2 根据条件变化 如果前面是前导0并且本位也是0 那么传递下去的就是limit并且是否到达上界 两个条件决定 因为 如果前面没有限制 i没到达上界 可以把下一位的递归上界设为9的else if(check(p4,p3,p2,p1,i))a+=DP(pos-1,p3,p2,p1,i,limit&&i==up);//每当我前面有限制和当前位是记录位大小时限制传递}if(!limit)dp[pos][p4][p3][p2][p1]=a;//1每当把一种p组合的数遍历结束后 就把他们记录下来return a;
}
ll solve(ll x)
{dig=0;while(x){d[++dig]=x%10;x/=10;}return DP(dig,10,10,10,10,1);//传入时需要有限制 由于不能让最高位的up到9 需要到d[pos]
}
int main()
{while(~scanf("%lld%lld%lld",&l,&r,&k)){memset(dp,-1,sizeof(dp));printf("%lld\n",solve(r)-solve(l-1));}return 0;
}

HDU 5787 wolf Number 数位dp相关推荐

  1. HDU 3709 Balanced Number (数位DP)

    题意 求出[x, y] 范围内的平衡数,平衡数定义为:以数中某个位为轴心,两边的数的偏移量为矩,数位权重,使得整个数平衡. 思路 外层枚举平衡点,然后数位DP即可.设计状态: dp[pos][o][l ...

  2. HDU - 3709 Balanced Number(数位dp)

    题目链接:点击查看 题目大意:将一串数字视为天平,两端平衡的数字称为平衡数,并求出一段闭区间中平衡数的个数.所谓的平衡条件即为力臂与 力相乘后两端的数量和可以抵消,例如数字4139可以视为以3为中轴的 ...

  3. HDU odd-even number 数位dp

    题意 在l到r区间内求有多少个符合条件"当前数中所有连续的奇数长度是偶数 所有连续的偶数长度是奇数"的个数 分析 典型的数位dp问题 我们设置dp数组时可以根据 dp[pos][p ...

  4. HDU 3555 Bomb(数位DP模板啊两种形式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...

  5. HDU 6156 Palindrome Function 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...

  6. Hdu 2089-不要62 数位dp

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others)    Me ...

  7. HDU 2089 不要62 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2089 题目描述: 给定一个区间, 让你求这个区间中所有不带62 或 4 的数的个数 解题思路: 很明 ...

  8. fzu 2109 Mountain Number 数位DP

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109 题意: 如果一个>0的整数x,满足a[2*i+1] >= a[2*i]和a[2*i+2],则 ...

  9. HDU 3271 SNIBB(数位DP+构造)

    思路:数位DP+构造,先dp[i][j]表示i位总和为j的情况数,然后两种情况分别去进行数位DP,按高位往低位放去构造即可 代码: #include <cstdio> #include & ...

最新文章

  1. ARM-Button-Driver-硬件图
  2. Table Dragger - 简单的 JS 拖放排序表格插件
  3. Python模拟随机漫步
  4. 一个非常感人的爱情故事
  5. xcode模拟器不显示键盘解决方案
  6. Oracle底子根基数据圭臬尺度存储格式浅析(三)——日期圭臬尺度(四)
  7. 一看就懂-grep命令详解
  8. c++rs法计算hurst指数_计算机组成原理与接口技术
  9. python计算器函数图像_Python图形计算器,python,图像,化
  10. TCP/UDP常用端口号,大家快收藏
  11. 教学系列CentOS安装和配置无线网卡
  12. 数字图像处理——灰度变换
  13. Java 实现扫雷与高胜率低耗时自动扫雷 AI (下)
  14. Vue常用的组件库大全【前端工程师必备】【实时更新】【移动端、PC端(web端)、数据可视化组件库(数据大屏) 、动画组件库、3D组件库】
  15. linux 上 gcc -m32 编译报错解决方案
  16. 感悟生活,再来聊聊拼多多
  17. idea中创建maven依赖下的web工程(一)----用户登录界面
  18. 华为服务器怎么进入系统,服务器怎么进入系统
  19. GB2312、GBK、GB18030 这几种字符集的主要区别是什么?
  20. unity3d shader ar任意门(传送门)

热门文章

  1. CAF(C++ actor framework)(序列化之结构体,任意嵌套STL)(一)
  2. VS或编译的时候不生成Release文件夹
  3. java同时满足语句_关于控制语句,下列哪些说法符合《阿里巴巴Java开发手册》:...
  4. 面试官:说一下List排序方法
  5. 了解一下Elasticsearch的基本概念
  6. nginx设置 二级域名 指定端口
  7. word 2010中正文页码如何从第1页开始?
  8. 服务器的性能监测及工具(profmon)
  9. sqlserver启用登陆审计
  10. 你会通过Docker部署war包吗