题目描述:

  定义数的消除操作为选定[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 = , M = 2e6+, inf = 2e9, mod = 1e9+;
int d[N];
long long L,R,k,dp[][<<][],vis[][<<][];
int cal(int p,int i) {
for(int k=i+;k<=;k++) if(p&(<<k)) p^=(<<k);
return p;
}
long long dfs(int dep,int f,int p,int K)
{
if(dep<) 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]=;
for(int i=;i<=;i++)
{
if(p&(<<i)||i==) {
ret+=dfs(dep-,f,cal(p,i),K);
}
else ret+=dfs(dep-,f,cal(p|(<<i),i),K+);
}
return ret;
}
else {
long long ret = ;
for(int i=;i<=d[dep];i++)
{
if(p&(<<i)||i==)
ret+=dfs(dep-,i<d[dep],cal(p,i),K);
else ret+=dfs(dep-,i<d[dep],cal(p|(<<i),i),K+);
}
return ret;
}
}
long long solve(long long x)
{
memset(dp,,sizeof(dp));
memset(vis,,sizeof(vis));
int len = ;
while(x){
d[len++] = x%;
x/=;
}
dfs(len-,,,);
}
int main(){
while(scanf("%lld%lld%lld",&L,&R,&k)!=EOF)
{
printf("%lld\n",solve(R)-solve(L-));
}
return ;
}

51NOD 1623 完美消除 数位DP的更多相关文章

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

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

  2. 51nod 1232 完美数 数位dp

    1232 完美数 题目来源: 胡仁东 基准时间限制:2 秒 空间限制:131072 KB  如果一个数能够被组成它的各个非0数字整除,则称它是完美数.例如:1-9都是完美数,10,11,12,101都 ...

  3. 51nod 1043 幸运号码(数位dp)

    题目链接:51nod 1043 幸运号码 题解:dp[i][j]表示 i 个数和为 j 的总数(包含0开头情况) dp[i][j] = dp[i-1][j-k] i & 1 :这里用滚动数组节 ...

  4. 51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给 ...

  5. 51nod 1042 数位dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042 1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131 ...

  6. 51nod 1009 数位dp入门

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 1009 数字1的数量 基准时间限制:1 秒 空间限制:13107 ...

  7. [51nod Round 15 B ] 完美消除

    数位DP. 比较蛋疼的是,设a[i]表示第i位上数字,比方说a[1]<a[2]>a[3],且a[1]==a[3]时,这两位上的数可以放在一起搞掉. 所以就在正常的f数组里多开一维,表示后面 ...

  8. 51nod 1009 数字1的数量(数位dp模板)

    给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1.   数位dp的模板题   ...

  9. 51Nod 1009 数字1的个数 | 数位DP

    题意: 小于等于n的所有数中1的出现次数 分析: 数位DP 预处理dp[i][j]存 从1~以j开头的i位数中有几个1,那么转移方程为: if(j == 1) dp[i][j] = dp[i-1][9 ...

随机推荐

  1. Linix常用命令

    uname -a    查看内核版本        ls -al    显示所有文件的属性 pwd         显示当前路径         cd -    返回上一次目录     cd ~    ...

  2. gvim-ide plugins

    omnicppcomplete-0.41.zip after: ftplugin: c.vim,cpp.vim,两个文件的内容相同, 其中都只有一个call语句: call omni#cpp#comp ...

  3. html tr td colspan

    colspan  属性规定单元格可横跨的列数, 第一行的colspan规定其一行所跨越的列数,要与下一行的<td></td>个数一致 if(!empty ($alarmDesc ...

  4. 解决ie文本框不能输入和获取焦点问题

    解决办法:    从正常的机器上拷贝c:\windows\system32\mshtmled.dll到本机的system32目录下即可.或者从安装盘中提取该文件.    加载mshtmled.dll: ...

  5. HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)

    C - 最大连续子序列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  6. 原创:分享asp.net伪静态成目录形式iis如何设置

    服务器租用详解asp.net伪静态成目录形式iis如何设置: 一.首先介绍一下asp.net伪静态成html后缀iis如何设置的 iis6 伪静态 iis配置方法 图解 1.右键点击 要设置网站的网站 ...

  7. Python egg

    http://blog.csdn.net/turkeyzhou/article/details/8876658

  8. 在Python脚本中判断Python的版本

    引自:http://segmentfault.com/q/1010000000127878 如果是给人读,用 sys.version,如果是给机器比较,用 sys.version_info,如果是判断 ...

  9. Android 中“TabBar”的背景拉伸问题

    在最近的一个工程中,要求有一个在上方了tabbar,上面有并排的3个方形按钮,每个按钮都有背景图.问题来了,如何让图片在不同尺寸的屏幕上不失真呢?(由于我们的项目比较小,工时很短,不能为每一个屏幕尺寸 ...

  10. Java for LeetCode 150 Evaluate Reverse Polish Notation

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...