题意:统计l-r中每种数字出现的次数

很明显的数位dp问题,虽然有更简洁的做法但某人已经习惯了数位dp的风格所以还是选择扬长避短吧(说白了就是菜啊)

从高位向低位走,设状态$(u,lim,ze)$表示当前走到了第几位,是否有上限,是否有前导零的状态,则问题转化成了求所有转移路径中经过的所有数字的数量统计问题。

设$f[u][lim][ze]$为从状态$(u,lim,ze)$向后走能到达的状态总数,$g[u][lim][ze][i]$为状态$(u,lim,ze)$及其向后走能到达的所有状态中数字$i$出现的总数,各种转移就行了,实现细节比较复杂就不啰嗦了~~

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=10+5,inf=0x3f3f3f3f;
 5 int l,r,bit[N],nb,f[N][2][2],g[N][2][2][10],vis[N][2][2],cnt[N],ka;
 6 void dfs(int u,int lim,int ze) {
 7     if(vis[u][lim][ze]==ka)return;
 8     vis[u][lim][ze]=ka;
 9     if(u==0) {
10         f[u][lim][ze]=1;
11         for(int i=0; i<=9; ++i)g[u][lim][ze][i]=0;
12         return;
13     }
14     f[u][lim][ze]=0;
15     for(int i=0; i<=9; ++i)g[u][lim][ze][i]=0;
16     for(int i=0; i<=(lim?bit[u]:9); ++i) {
17         int lim2=(lim&&i==bit[u]),ze2=(ze&&i==0);
18         dfs(u-1,lim2,ze2);
19         f[u][lim][ze]+=f[u-1][lim2][ze2];
20         if(!(ze&&i==0))g[u][lim][ze][i]+=f[u-1][lim2][ze2];
21         for(int j=0; j<=9; ++j)g[u][lim][ze][j]+=g[u-1][lim2][ze2][j];
22     }
23 }
24 void solve(int x,int F) {
25     for(nb=0; x; x/=10)bit[++nb]=x%10;
26     dfs(nb,1,1);
27     for(int i=0; i<=9; ++i)cnt[i]+=F*g[nb][1][1][i];
28 }
29 int main() {
30     while(scanf("%d%d",&l,&r)&&l) {
31         if(l>r)swap(l,r);
32         memset(cnt,0,sizeof cnt);
33         ++ka,solve(r,1);
34         ++ka,solve(l-1,-1);
35         for(int i=0; i<=9; ++i)printf("%d%c",cnt[i]," \n"[i==9]);
36     }
37     return 0;
38 }

转载于:https://www.cnblogs.com/asdfsag/p/11278519.html

UVA - 1640 The Counting Problem (数位dp)相关推荐

  1. UVA - 11361 Investigating Div-Sum Property(数位dp/记忆化搜索板子)

    题目:https://vjudge.net/problem/UVA-11361 思路:数位dp,用记忆化搜索写,dp[pos][i][j][limit] 代表剩余有pos位,每位上的数字和模k 等于i ...

  2. hdu 5435 A serious math problem 数位dp

    问题描述 小俊很喜欢数学,现在他要给你出一道严肃的数学题. 定义 FxF[x] 为x在十进制表示下各位数字的异或和,例如F1234 1 xor 2 xor 3 xor 4 4F(1234) = 1 x ...

  3. hdu 5435 A serious math problem(数位dp)

    题目链接:hdu 5435 A serious math problem 裸的数位dp. #include <cstdio> #include <cstring> #inclu ...

  4. 2018.09.28 hdu5435A serious math problem(数位dp)

    传送门 数位dp卡常题. 写了一发dfs版本的发现过不了233. 于是赶紧转循环版本. 预处理出f数组. f[i][j]f[i][j]f[i][j]表示前i位数异或和为j的方案数. 然后每次直接数位d ...

  5. 解题报告 (十四) 数位DP

    文章目录 数位DP 解题报告 HDU 4722 Good Numbers HDU 2089 不要62 HDU 3555 Bomb HDU 3652 B-number PKU 3252 Round Nu ...

  6. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  7. 数位DP 不断学习中。。。。

    1, HDU 2089  不要62 :http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:不能出现4,或者相邻的62, dp[i][0],表示不存在不吉 ...

  8. BZOJ 1799 [Ahoi2009] self 同类分布(数位DP)【BZOJ千题计划(quexin】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/1799(样例时限设置有问题,应该为 2 ...

  9. HDU 4352 数位dp + LIS(nlogn) + 状态压缩

    #define xhxj (Xin Hang senior sister(学姐))  If you do not know xhxj, then carefully reading the entir ...

最新文章

  1. python word2vector (三)
  2. [翻译]在GridView中插入新记录
  3. 微信验证服务器是怎么回事,微信服务器认证为什么需要这么多参数?
  4. freebsd镜像作用和vmware服务开启
  5. python数据分析笔记——数据加载与整理
  6. .Neter们,你真的应该了解下EFCore3.x
  7. 菜鸟nginx源码剖析
  8. XSLT2.0---多文件输出
  9. List遍历的三种方式
  10. 第一课:OD软件界面基本介绍
  11. linux下golang protoc安装详细教程
  12. 国内的9家域名顶级注册商
  13. python xgboost建模过程_python - Dask中的XGBoost建模 - SO中文参考 - www.soinside.com
  14. 『TensorFlow』pad图片
  15. java httpclient cdn_Java 11`HttpClient`下载但不是吗? (负内容长度)
  16. 尚硅谷在线教育五:尚硅谷在线教育讲师管理开发
  17. SVN服务端使用说明(二)
  18. Mysql慢查询日志的使用 和 Mysql的优化
  19. android 判断是否为系统应用
  20. 将数组转为xml格式

热门文章

  1. 软件测试sd卡真伪,亲测,拼多多上买的SD卡到底是不是正品
  2. bak格式文件导入mysql
  3. 2021-08-14c++面向对象的三大特性之二——继承
  4. c++11 is_copy_assignable说明
  5. Java 冬令时-夏令时转换方法
  6. 记录-关于微吼直播的对接
  7. 广告效果聚类分析 -------- KMeans
  8. java运行内存溢出指什么内存溢出_项目正常启动,但是在访问页面的时候java报内存溢出错误。。小感悟...
  9. python滚动截图(利用Puppeteer实现)
  10. 数字化婚姻配对尝试问题(C++实现)