题目描述:

  定义数的消除操作为选定[L,R,x],如果数的第L到第R位上的数字都大于等于x,并且这些数都相等,那么该操作是合法的(从低位到高位编号,个位是第一位,百位是第二位……),然后将这些位数上的数减x;否则就是不合法的,不能进行操作。对一个数操作最少的次数使得这个数变成0,这个操作次数称为该数的最小操作数。如:1232的最小操作数为3,一个合法解是[2,2,1],[1,3,2],[4,4,1]。

求L~R中最小操作数为k的数的个数。

例如:132,需要操作3次才能变为0。而131131 => 111131 => 111111 =>0

输入:

  单组测试数据。三个整数L、R和k(1<=L<=R<=10^18,1<=k<=18)

题解:

  典型数位DP

  设定dp[i][j][k] 前i位下所用数字状态j花费次数时k的个数

  注意这里的状态j是指 后面的放入数字能有重复效应的 状态

  例如 313 花费的次数是3 但131花费次数2    两者在第二位的状态 是(3)和(1)

  最后还要注意0不花费

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 30, M = 2e6+10, inf = 2e9, mod = 1e9+7;
int d[N];
long long L,R,k,dp[20][1<<10][20],vis[20][1<<10][20];
int cal(int p,int i) {for(int k=i+1;k<=9;k++) if(p&(1<<k)) p^=(1<<k);return p;
}
long long dfs(int dep,int f,int p,int K)
{if(dep<0) return K==k;if(f&&vis[dep][p][K]) return dp[dep][p][K];if(f){long long& ret = dp[dep][p][K];vis[dep][p][K]=1;for(int i=0;i<=9;i++){if(p&(1<<i)||i==0) {ret+=dfs(dep-1,f,cal(p,i),K);}else ret+=dfs(dep-1,f,cal(p|(1<<i),i),K+1);}return ret;}else {long long ret = 0;for(int i=0;i<=d[dep];i++){if(p&(1<<i)||i==0)ret+=dfs(dep-1,i<d[dep],cal(p,i),K);else ret+=dfs(dep-1,i<d[dep],cal(p|(1<<i),i),K+1);}return ret;}
}
long long solve(long long x)
{memset(dp,0,sizeof(dp));memset(vis,0,sizeof(vis));int len = 0;while(x){d[len++] = x%10;x/=10;}dfs(len-1,0,0,0);
}
int main(){while(scanf("%lld%lld%lld",&L,&R,&k)!=EOF){printf("%lld\n",solve(R)-solve(L-1));}return 0;
}

转载于:https://www.cnblogs.com/zxhl/p/5658443.html

51NOD 1623 完美消除 数位DP相关推荐

  1. 51nod 1623 完美消除(数位DP)

    首先考虑一下给一个数如何求它需要多少次操作. 显然用一个单调栈就可以完成:塞入栈中,将比它大的所有数都弹出,如果栈中没有当前数,答案+1. 因为数的范围只有0~9,所以我们可以用一个二进制数来模拟这个 ...

  2. stone/reverse/string/digit(完美消除)

    stone/reverse/string/digit(完美消除) stone: [问题描述] 平平去海边度假,海边有一片美丽的鹅卵石滩.平平在鹅卵石滩上捡了 $n$ 块美丽的 鹅卵石,并把它们排成一个 ...

  3. 数位dp 的简单入门

    时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...

  4. hdu2089 不要62 数位dp

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. Hdu 2089-不要62 数位dp

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

  6. mysql dp.cal 显示汉子_计算1到N中各个数字出现的次数 --数位DP

    题意:给定一个数n,问从1到n中,0~9这10个数字分别出现了多少次.比如366这个数,3出现了1次,6出现了2次. 题解:<剑指offer>P174:<编程之美>P132 都 ...

  7. Bzoj 3652: 大新闻(数位dp)

    以下内容来自ShallWe's Blog 题目 3652: 大新闻 Description Input Output \(1<=N<=10^18\) 解题报告 显然是一道数位dp的题目,观 ...

  8. 1043 幸运号码 数位DP

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 设dp[i][j]表示前i位数中,i位数的和为j时的所有情况. 转 ...

  9. HDU2089 不要62【数位DP+记忆化搜索】

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  10. 算法复习——数位dp(不要62HUD2089)

    题目 题目描述 杭州人称那些傻乎乎粘嗒嗒的人为 62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司 ...

最新文章

  1. php log pecl,PHP日志扩展SeasLog-1.0.0正式版在PECL发布
  2. makefile编译_C++ Lesson 5:编译Makefile
  3. android 9.x 实现应用内更新安装
  4. Python之gmplot:gmplot库的简介、安装、使用方法之详细攻略
  5. boost::coroutine模块实现parallel的测试程序
  6. 这是我用Microsoft Word 2010 直接发布的测试用博客
  7. 软件测试工程师-软件测试基本介绍
  8. VMware虚拟机下Ubuntu安装VMware Tools详解
  9. cpp map 获取所有 key_uniapp 利用map标签 开发地图定位和搜索关键字查询功能
  10. 2021年武汉理工大学计算机考研复试详解 计算机学硕
  11. Pr 音频效果参考:立体声声像、时间与变调
  12. vue IE兼容性问题汇总
  13. mysql数据库所有表合并_mysql数据库如何将表合并我从数据库中倒出表导出后是这样的b 爱问知识人...
  14. 【MySQL】必知必会知识点
  15. VBA:获取工作簿中所有表的名称、地址
  16. 刺激前低的EEG alpha功率增强了视觉知觉,但不是视觉知觉敏感度
  17. OpenVINO示例介绍
  18. 机器学习实践之集成方法(随机森林和AdaBoost元算法提高分类性能)
  19. html中锚记标记的隐藏,在 Dreamweaver 中选择、查看和设置不可见元素 - Dreamweaver 用户指南...
  20. 本地图片保存映射到Markdown文件中

热门文章

  1. 机器学习当道,还在使用基于词典的文本挖掘方法么,过时啦!
  2. java中获得IP地址
  3. Lua 笔记--表达式
  4. “经历”重于“技术”
  5. C#如何生成随机不重复的数字
  6. 5月第3周回顾:08软考举行 中国遭大范围SQL注入***
  7. rm -f .... 恢复
  8. XDebug On Ubuntu
  9. jmeter学习指南之中文乱码
  10. android文章 - 收藏集 - 掘金