题目链接

小Z的 k 紧凑数

解题思路

数位DP,把每一个数位的每一个数对应的可能性表示出来,然后求\(num(1,r)-num(1,l-1)\),其中\(num(i,j)\)表示\([i,j]\)区间里符合要求的数的个数。

其中,\(dp[i][j]\)表示第\(i\)位数字为\(j\)的选择种数。

计算的时候,比如\(num(456)\),就拆开为\(num(1,99)+num(100,399)+num(400,449)+num(450,455)+num(456,456)\)

AC代码

#include<stdio.h>
long long k,dp[20][14],l,r;
int absf(int a){
if(a<0)return -a;
return a;
}
void dpf(){
int i,j,m;
for(i=0;i<=9;i++)dp[0][i]=1;//个位数,初始化为1
for(i=1;i<20;i++)//这是总共的位数
for(j=0;j<=9;j++)//这是这一位
for(m=0;m<=9;m++)//这是上一位
if(absf(j-m)<=k)dp[i][j]+=dp[i-1][m];//这一位和上一位满足条件则加上
}
long long num(long long x){
int n[20]={0},cnt=0,i,j;
long long ans=0;
while(x>0){
n[cnt++]=x%10;
x/=10;
}
//首位为0
for(i=0;i<cnt-1;i++)
for(j=1;j<=9;j++)
ans+=dp[i][j];
//首位为[1,n[cnt-1])
if(cnt>0)for(i=1;i<n[cnt-1];i++)ans+=dp[cnt-1][i];
//首位为n[cnt-1]
for(i=cnt-2;i>=0;i--){
for(j=0;j<n[i];j++){
if(absf(n[i+1]-j)<=k)ans+=dp[i][j];
}
if(absf(n[i+1]-n[i])>k)break;
//非常重要!!前几位已经不满足绝对值之差不大于k之后就不能再继续下去了
if(!i&&absf(n[i+1]-j)<=k)ans+=dp[i][j];//这里相当于计算那个num(456,456)
}
if(cnt==1)ans++;//这里也相当于计算那个num(456,456),但是个位数不会进入上面那个循环
return ans;
}
int main(){
scanf("%lld%lld%lld",&l,&r,&k);
dpf();
printf("%lld",num(r)-num(l-1));
return 0;
}

最新文章

  1. ZeroMQ接口函数之 :zmq_send_const – 从一个socket上发送一个固定内存数据
  2. Linux和UNIX监控
  3. Easyui Combotree问题及其相关
  4. phpcmsv9如何实现添加栏目时不在首页内容区显示只在导航栏显示
  5. [SSH 2] 以网站主页面浅谈Struts2配置
  6. 编写一函数用来实现左右循环移位。函数原型为move(value,n);n&gt;0时右移n位,n&lt;0时左移|n|位。
  7. PHP中长连接的实现
  8. 28.leetcode 13. Roman to Integer
  9. LGTB与序列 状压dp
  10. Java 容器 接口
  11. axure 预览&quot;HTTP/1.1 302 Found&quot;
  12. js文档碎片
  13. Java SQL注入学习笔记
  14. Excel的方向键失灵
  15. [转]连连看游戏 C#
  16. Java中 Random
  17. Mysql中datetime和timestamp区别
  18. Task WaitAll的用法
  19. Android性能优化之数据库优化
  20. iOS之点击通知栏跳转应用的相关页面

热门文章

  1. 局部变量 static new 结构体指针
  2. redis字典
  3. 关于谷歌浏览器不支持html5中audio的autoplay解决方法(js代码解决)
  4. JS Calendar API
  5. PWA &amp; bug
  6. js 获取包含emoji的字符串的长度
  7. js 的 ArrayBuffer 和 dataView
  8. js 截取固定长度字符串但不打断单词
  9. NGK治理机制研究
  10. std::unordered_map与std::map