题目大意

Vjudge链接

定义一个数的内部LIS长度表示这个数每个数位构成的序列的LIS长度,给出区间\([l,r]\),求区间内内部LIS长度为\(k\)的数的个数。

输入格式

第一行给出数据组数\(T\)。

每组数据给出三个数,分别为\(l、r、k\)。

数据范围

\(0<L\le R<2^{63},1\le K\le 10\)

输出格式

对于每组数据\(t\),输出Case #t:ans

\(ans\)表示本组数据符合条件数的个数。

样例输入

1

123 321 2

样例输出

Case #1: 139

思路

  • 首先处理区间还是用类似前缀和的方法,把\([l,r]\)处理成\([0,r]-[0,l-1]\)。
  • 可以看出数据范围是很大的,直接用原始方法求LIS肯定不行,因此本题采用的方法就是状态压缩DP。
    • 状态压缩的二进制数中的第\(i\)个1的位置,表示以\(i\)作为序列的LIS最小是多少。最后统计1的个数,则1的个数即为LIS的长度。
    • 其他类似普通的LIS的操作,修改0和1即可。

代码

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;//记得用long long
ll T,l,r,k;
ll dp[25][1<<10][15];//分别为当前数位,状态压缩二进制数,要求的LIS长度
ll bit[25];//储存每位的数字 int update(int x,int y){
for (int i=x;i<10;++i)
if (y&1<<i)return (y^(1<<i)|(1<<x));//x位替换x后第一个1
return y|(1<<x);//这是x最大的情况,直接把x位变成1即可
} int getans(int x){//求1的个数
int ans=0;
while(x){
if (x&1)
ans++;
x>>=1;
}
return ans;
} ll dfs (int pos,int s,bool e,bool z){
//pos:位数计数器,s:LIS状态,e:边界判定,z:前面所有位是否全都是0
if(pos==-1)
return getans(s)==k;//判断是否符合要求
if(!e&&dp[pos][s][k]!=-1)
return dp[pos][s][k];//记忆化剪枝 ll ans=0;
int lastnum=e ? bit[pos] : 9;
for(int i=0;i<=lastnum;++i)
ans+=dfs(pos-1,(z&&i==0) ? 0 : update(i,s),e&&i==lastnum,z&&(i==0));//向下传递
if(!e)dp[pos][s][k]=ans;//记忆化剪枝
return ans;
} ll Solve(ll n){
int len=0;
while(n){//求出每位的数字并储存在bit数组中
bit[len++]=n%10;
n/=10;
}
return dfs(len-1,0,1,1);
} int main(){
memset(dp,-1,sizeof dp);
scanf("%lld",&T);
int casenum=0;
while (T--){
scanf("%lld%lld%lld",&l,&r,&k);
printf("Case #%d: ",++casenum);
printf("%lld\n",Solve(r)-Solve(l-1));
}
return 0;
}

【状态压缩DP】HDU 4352 XHXJ'S LIS的更多相关文章

  1. HDU 4352 XHXJ's LIS 数位dp lis

    目录 题目链接 题解 代码 题目链接 HDU 4352 XHXJ's LIS 题解 对于lis求的过程 对一个数列,都可以用nlogn的方法来的到它的一个可行lis 对这个logn的方法求解lis时用 ...

  2. HDU 4352 XHXJ's LIS HDU(数位DP)

    HDU 4352 XHXJ's LIS HDU 题目大意 给你L到R区间,和一个数字K,然后让你求L到R区间之内满足最长上升子序列长度为K的数字有多少个 solution 简洁明了的题意总是让人无从下 ...

  3. hdu 4352 XHXJ's LIS 数位dp+状态压缩

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others ...

  4. hdu 4352 XHXJ's LIS (数位dp+状态压缩)

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

  5. HDU 4352 XHXJ's LIS (数位DP+LIS+状态压缩)

    题意:给定一个区间,让你求在这个区间里的满足LIS为 k 的数的数量. 析:数位DP,dp[i][j][k] 由于 k 最多是10,所以考虑是用状态压缩,表示 前 i 位,长度为 j,状态为 k的数量 ...

  6. hdu 4352 XHXJ's LIS 数位DP+最长上升子序列

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

  7. HDU.4352.XHXJ's LIS(数位DP 状压 LIS)

    题目链接 \(Description\) 求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\). \(Solution\) 数位DP. 至于怎么求LIS, ...

  8. HDU 4352 XHXJ's LIS (数位DP,状压)

    题意: 前面3/4的英文都是废话.将一个正整数看成字符串,给定一个k,问区间[L,R]中严格的LIS=k的数有多少个? 思路: 实在没有想到字符0~9最多才10种,况且也符合O(nlogn)求LIS的 ...

  9. HDU 4352 - XHXJ's LIS - [数位DP][LIS问题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

随机推荐

  1. TouchAction实现连续滑动设置手势密码

    首先使用工具获取到元素坐标位置,可以看到起始位置是[144,462],终点位置是[576,894] 分析: 该图形可以横竖划分六等分 那么第一个圆中心点的坐标: x=144+(576-144)/6 y ...

  2. python之os模块使用

    python中os模块的常用语法 1.查看当前路径及路径下的目录 os.getcwd():返回当前路径(不包括文件名) os.listdir():返回当前路径下的所有目录列表. os.listdir( ...

  3. Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!

    Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位.本文即基于最佳实践的 Metr ...

  4. 软件工程与UML作业2

    博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018SE ...

  5. (专题一)01 matlab基础

    功能区:主页,绘图,应用程序 当前文件夹工具栏 命令行窗口:输入命令,按下回车键,会在后面显示执行后的命令 如果命令行很长可以分两行来写,用“...”做续行符 建立当前文件夹:可以用cd命令 例如在d ...

  6. Python+Appium运行简单的demo,你需要理解Appium运行原理!

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.Appium 的理念 四个原则 1.Web-Selenium 的运行原理 2.Appium ...

  7. TB级倾斜模型加载速度太慢?这是我见过最快的加载方式没有之一

    随着无人机性能快速提升,单个项目涉及到的倾斜摄影模型数据范围.数据量及单个模型体积也在不断变大,带来的问题是数据显示速度却越来越慢,那么如何在不升级配置的情况下提升模型的加载速度呢?   TB级倾斜摄 ...

  8. 中秋国庆8天挑战赛 之 挑战8天掌握微信小程序

    中秋国庆8天挑战赛 挑战8天掌握微信小程序 当前学习进度: // 10.1​// 学习内容:​// 10.2​// 学习内容:​// 10.3​// 学习内容:​// 10.4​// 学习内容:​// ...

  9. Linux知识点笔记

    Linux启动脚本 rcS文件,rcS文件位于系统根目录下的"/etc/init.d"下.  rcS文件本质是一个bash shell脚本,因此遵循bash脚本的语法规则. [1] ...

  10. 【音乐爬虫】Python爬虫-selenium+browsermob-proxy 解决动态网页 js渲染问题

    1.一般的python爬虫很简单,直接请求对应网址,解析返回的数据即可,但是有很多网站的数据的js动态渲染的,你直接请求是得不到对应的数据的 这时就需要其它手段来处理了. 2.以一个例子来说明,整个过 ...