博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客小白月赛8 - E - 诡异数字 数位DP
阅读量:4694 次
发布时间:2019-06-09

本文共 1717 字,大约阅读时间需要 5 分钟。

 

题意:

    求区间中,满足限制条件的数字的个数。 限制条件就是某些数字不能连续出现几次。

思路:

    比较裸的数位DP, DP数组开一个dp【len】【x】【cnt】 表示长度为len,x这个数字连续出现cnt次的个数。

#include 
#include
#include
#include
#include
typedef long long ll;using namespace std;const int mod = 20020219; int dp[22][11][22]; int cnt[11],shu[22]; ll swdp(int len, int x,int sum, bool limit){ if(len == 0)return 1; if(!limit && dp[len][x][sum]) return dp[len][x][sum]; int mx = limit ? shu[len] : 9; ll res = 0; for(int i=0; i<=mx; i++){ if(x==i && sum + 1 > cnt[x])continue; if(x==i) res = (res + swdp(len-1,x,sum+1, limit && i == mx)) % mod; else res = (res + swdp (len-1,i,1,limit && i == mx))%mod; } return limit?res:dp[len][x ][sum] = res; } ll solve(ll x){ if(x == -1)return 0; int k = 0; while(x > 0){ shu[++k] = x % 10; x /= 10; } return swdp(k, 0, 0, true); }int main(){ int t,n; scanf("%d", &t); ll le,ri; while(t--) { for(int i=0; i<=9; i++)cnt[i] = 21; memset(dp,0,sizeof(dp)); scanf("%lld%lld%d", &le, &ri, &n); while(n--) { int x,len; scanf("%d%d", &x, &len); cnt[x] = min(cnt[x] , len); } printf("%lld\n", (solve(ri) - solve(le-1) + mod)%mod); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/ckxkexing/p/9832431.html

你可能感兴趣的文章
Chinese remainder theorem 中国剩余定理
查看>>
快速幂算法
查看>>
django ORM
查看>>
单元测试的基本概念
查看>>
Track Active Item in Solution Explorer
查看>>
maven内置属性
查看>>
通过阿里镜像网站制作iso文件安装CentOS6.9
查看>>
静态局部变量
查看>>
多边形重心问题
查看>>
jquery下拉列表选中项改变时获取新选项的属性值
查看>>
变量赋值给变量
查看>>
mysql5.1非安装zip文件版安装指南
查看>>
强烈免费25款商务logo设计模板(转)
查看>>
Django中ORM字段以及字段参数介绍
查看>>
希腊字母在数学计算中表示的含义
查看>>
结对编程
查看>>
魔咒词典
查看>>
重新开始
查看>>
eclipse 灵活使用makefile来编译C/C++
查看>>
最短寻道优先算法----SSTF算法
查看>>