cf 834 E. Ever-Hungry Krakozyabra(爆搜+数位dp)

题意:

定义一种inedible tail为一个数把每一位数字按不降的顺序排列后,去掉前导0组成的序列

比如57040 组成的就是457 54组成就是45 45组成的也是45

问区间\([L,R]\)内有多少种inedible tail

题解: 直接数位dp做,需要存状态,太大处理不了。

这个问题等价于\(x0+x1+x2+...x9=18\)的非负整数解

组合数学 插空法 \(18+9个1,选9个插空,其余变1就是解,C(18+9,9) \approx 4*10^{6}\)

所以可以暴力枚举出所有方案,然后快速判断这种方案在\([L,R]\)内是否合法

用类似数位dp的思想,用上下界来枚举每一位能取的数字,到到达某一位时即不在上界也不在下界,说明后面的数字可以随便取,那么一定取得出这种方案

由于只有在上界或者下界的时候递归才会继续往下走,所以最多走18次,线性复杂度判断

#include<bits/stdc++.h>
#define LL long long
#define P pair<int,int>
#define ls(i) seg[i].lc
#define rs(i) seg[i].rc
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ls rt<<1
#define rs (rt<<1|1)
using namespace std;
int read(){
int x = 0;
char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x;
}
int pos,ans;
int a[20],b[20];
int cnt[10];///数字为i的个数
bool is(int pos,bool Lbound,bool Rbound){
if(pos == 0) return true;
if(!Lbound && !Rbound) return true;///不是上下界,后面的数字可以任意取一定存在合法的情况
int l = Lbound?a[pos]:0;
int r = Rbound?b[pos]:9;
if(l > r) return false;
for(int i = l;i <= r;i++){///枚举每一位能取的数字
if(cnt[i]){
cnt[i]--;
if(is(pos - 1,Lbound && i == l, Rbound && i == r)){
cnt[i]++;
return true;
}
cnt[i]++;
}
}
return false;
}
void dfs(int cur,int total){
if(cur == 9){
cnt[cur] = total;
ans += is(pos,1,1);
return ;
}
for(int i = 0;i <= total;i++){
cnt[cur] = i;
dfs(cur + 1, total - i);
}
}
int digit(int *d,LL x){
int pos = 0;
while(x){
d[++pos] = x % 10;
x /= 10;
}
return pos;
}
int main(){ LL L,R;
cin>>L>>R;
pos = digit(a,L);
pos = digit(b,R);
ans = 0;
dfs(0,pos);///暴力枚举所有的组合
cout<<ans<<endl;
return 0;
}

最新文章

  1. SQL镜像资料
  2. 如何理解和熟练使用JS 中的call apply
  3. iPhone 已停用
  4. C# RSA加密/解密
  5. ashx一般处理程序文件用处
  6. PHP安全设置(转载)
  7. java中关于SSL/TSL的介绍和如何实现SSL Socket双向认证
  8. Chapter 2 Open Book——17
  9. ES3:ElasticSearch 索引
  10. java的集合框架set 和map的深入理解
  11. 第一个java程序以及java的运行机制
  12. JVM 垃圾回收GC Roots Tracing
  13. 2. oracle创建表空间、用户并设置默认表空间、授权
  14. 【SE】Week1 : 四则运算题目生成器批改器程序总结
  15. AdvStringGrid 复选框、goRowSelect
  16. bzoj2875随机数生成器
  17. IEC62304软件维护框架
  18. Linux下模拟多线程的并发并发shell脚本
  19. 用poi-3.6-20091214.jar 实现java给excel资料加密
  20. JS常用的设计模式(4)——适配器模式

热门文章

  1. [优化]Steamroller-freecodecamp算法题目
  2. 基于Vue的SPA如何优化页面加载速度
  3. ORM初级实战简单的数据库交互
  4. django+xadmin在线教育平台(十二)
  5. js | JavaScript中数据类型转换总结
  6. Vue项目部署遇到的问题及解决方案
  7. 移动端h5页面meta标签设置
  8. JS常用数组方法及实例
  9. Linux相关常用命令
  10. 多线程之ReadWriteLock模拟缓存(九)