题目链接

\(Description\)

求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\)。

\(Solution\)

数位DP。

至于怎么求LIS,因为只有10个数,所以可以参照O(nlogn)求LIS的方法,状压记录状态。

每次加一个数和求LIS一样更新状态。最后状态中1的个数就是LIS的长度。

//93MS	3004K
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=(1<<10)+3; int K,bit[21];
LL f[21][N][12];//f[i][j][k] 当前到i位 状态为j 题目中的K为k(这个可以留着记忆化)
bool vis[21][N][12]; inline LL read()
{
LL now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int Count(int x)//可以预处理。。
{
int res=0;
for(; x; res+=x&1,x>>=1);
return res;
}
inline int Upd(int s,int x)//替换掉第一个>=x的位
{
for(int i=x; i<10; ++i)
if(s>>i&1) return (s^(1<<i))|(1<<x);
return s|(1<<x);
}
LL DFS(int x,bool lim,bool lead,int s)
{
if(!x) return Count(s)==K;
if(!lim && vis[x][s][K]) return f[x][s][K];//就算有前导零也是可以直接返回啊(本题s状态没变就没影响) LL res=0; int up=lim?bit[x]:9;
for(int i=0; i<=up; ++i)
res+=DFS(x-1,lim&&i==up,lead&&!i,(lead&&!i)?0:Upd(s,i)); if(!lim) vis[x][s][K]=1, f[x][s][K]=res;
return res;
}
LL Calc(LL x)
{
int cnt=0;
for(; x; x/=10) bit[++cnt]=x%10;
if(cnt<K) return 0;
return DFS(cnt,1,1,0);
}
inline LL Solve()
{
LL l=read(),r=read(); K=read();
return Calc(r)-Calc(l-1);
} int main()
{
for(int i=1,T=read(); i<=T; printf("Case #%d: %lld\n",i++,Solve()));
return 0;
}

HDU.4352.XHXJ's LIS(数位DP 状压 LIS)的更多相关文章

  1. hdu 4352 XHXJ's LIS(数位dp+状压)

    Problem Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefull ...

  2. 【HDU】4352 XHXJ's LIS(数位dp+状压)

    题目 传送门:QWQ 分析 数位dp 状压一下现在的$ O(nlogn) $的$ LIS $的二分数组 数据小,所以更新时直接暴力不用二分了. 代码 #include <bits/stdc++. ...

  3. hdu 4352 "XHXJ's LIS"(数位DP+状压DP+LIS)

    传送门 参考博文: [1]:http://www.voidcn.com/article/p-ehojgauy-ot.html 题解: 将数字num字符串化: 求[L,R]区间最长上升子序列长度为 K ...

  4. 【数位dp+状压】XHXJ 's LIS

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

  5. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  6. SPOJ10606 BALNUM - Balanced Numbers(数位DP+状压)

    Balanced numbers have been used by mathematicians for centuries. A positive integer is considered a ...

  7. CodeForces1073E 数位dp+状压dp

    http://codeforces.com/problemset/problem/1073/E 题意 给定K,L,R,求L~R之间最多不包含超过K个数码的数的和. 显然这是一道数位dp,在做的过程中会 ...

  8. lightoj 1021 - Painful Bases(数位dp+状压)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1021 题解:简单的数位dp由于总共就只有16个存储一下状态就行了.求各种进制能 ...

  9. HDU 4336 Card Collector:期望dp + 状压

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意: 一共有n种卡片.每买一袋零食,有可能赠送一张卡片,也可能没有. 每一种卡片赠送的概率为p ...

随机推荐

  1. 【比赛游记】FJOI2019瞎打记

    \(\mathrm{day}\) \(-4\) 又是睡到中午才起来,这样下去省选会睡迟的. 然后下午在补 WF2019 的题目,很快就能补完的(大雾). \(\mathrm{day}\) \(-3\) ...

  2. linux 下程序员专用搜索源码用来替代grep的软件ack(后来发现一个更快的: ag), 且有vim插件的

    发现一个比ack更快更好用的:  https://github.com/ggreer/the_silver_searcher   , 使用时命令为ag,它是基于ack的代码二次开发的,所有使用方法基本 ...

  3. c# 取本地ip地址

    public static System.Net.IPAddress[] GetIpAddress() { string hostName = System.Net.Dns.GetHostName() ...

  4. spring初识

    Spring是一个开源框架,它是为了解决企业应用开发的复杂性而创建的.Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益. Sp ...

  5. HTTP基础知识2

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  6. 每天一个linux命令:scp命令

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  7. 移动端适配js

    第一种.参考网易的 (我现在用这个多) https://www.cnblogs.com/well-nice/p/5509589.html var deviceWidth = document.docu ...

  8. 设置滚动条scrolltop

    scrolltop用来设置页面的滚动条的位置 兼容性:链接 $().scrolltop(值)

  9. keras2.0的一些变化

    keras 变化太快了https://github.com/fchollet/keras/wiki/Keras-2.0-release-notes

  10. 温故而知新--JavaScript书摘(二)

    前言 毕业到入职腾讯已经差不多一年的时光了,接触了很多项目,也积累了很多实践经验,在处理问题的方式方法上有很大的提升.随着时间的增加,愈加发现基础知识的重要性,很多开发过程中遇到的问题都是由最基础的知 ...