51NOD 1623 完美消除 数位DP
题目描述:
定义数的消除操作为选定[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相关推荐
- 51nod 1623 完美消除(数位DP)
首先考虑一下给一个数如何求它需要多少次操作. 显然用一个单调栈就可以完成:塞入栈中,将比它大的所有数都弹出,如果栈中没有当前数,答案+1. 因为数的范围只有0~9,所以我们可以用一个二进制数来模拟这个 ...
- stone/reverse/string/digit(完美消除)
stone/reverse/string/digit(完美消除) stone: [问题描述] 平平去海边度假,海边有一片美丽的鹅卵石滩.平平在鹅卵石滩上捡了 $n$ 块美丽的 鹅卵石,并把它们排成一个 ...
- 数位dp 的简单入门
时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...
- hdu2089 不要62 数位dp
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Hdu 2089-不要62 数位dp
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others) Me ...
- mysql dp.cal 显示汉子_计算1到N中各个数字出现的次数 --数位DP
题意:给定一个数n,问从1到n中,0~9这10个数字分别出现了多少次.比如366这个数,3出现了1次,6出现了2次. 题解:<剑指offer>P174:<编程之美>P132 都 ...
- Bzoj 3652: 大新闻(数位dp)
以下内容来自ShallWe's Blog 题目 3652: 大新闻 Description Input Output \(1<=N<=10^18\) 解题报告 显然是一道数位dp的题目,观 ...
- 1043 幸运号码 数位DP
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 设dp[i][j]表示前i位数中,i位数的和为j时的所有情况. 转 ...
- HDU2089 不要62【数位DP+记忆化搜索】
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 算法复习——数位dp(不要62HUD2089)
题目 题目描述 杭州人称那些傻乎乎粘嗒嗒的人为 62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司 ...
最新文章
- php log pecl,PHP日志扩展SeasLog-1.0.0正式版在PECL发布
- makefile编译_C++ Lesson 5:编译Makefile
- android 9.x 实现应用内更新安装
- Python之gmplot:gmplot库的简介、安装、使用方法之详细攻略
- boost::coroutine模块实现parallel的测试程序
- 这是我用Microsoft Word 2010 直接发布的测试用博客
- 软件测试工程师-软件测试基本介绍
- VMware虚拟机下Ubuntu安装VMware Tools详解
- cpp map 获取所有 key_uniapp 利用map标签 开发地图定位和搜索关键字查询功能
- 2021年武汉理工大学计算机考研复试详解 计算机学硕
- Pr 音频效果参考:立体声声像、时间与变调
- vue IE兼容性问题汇总
- mysql数据库所有表合并_mysql数据库如何将表合并我从数据库中倒出表导出后是这样的b 爱问知识人...
- 【MySQL】必知必会知识点
- VBA:获取工作簿中所有表的名称、地址
- 刺激前低的EEG alpha功率增强了视觉知觉,但不是视觉知觉敏感度
- OpenVINO示例介绍
- 机器学习实践之集成方法(随机森林和AdaBoost元算法提高分类性能)
- html中锚记标记的隐藏,在 Dreamweaver 中选择、查看和设置不可见元素 - Dreamweaver 用户指南...
- 本地图片保存映射到Markdown文件中