题目大意

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. python基础:面向对象

    一.定义 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类:一个种类,一个模型. 对象:指具体的东西,模型造出来的东西叫做对象. 实例:实例和对象是一样的. 实例化:实例化就 ...

  2. Django 多页面间参数传递用session方法(Django七)

    由一个页面跳转至另一个页面可以有render中携带几个参数,如下:照上例便在跳转到homepage页面后使用传递的四个参数了 但问题是如何在由homepage跳转到其他页面时仍可以使用这四个参数呢?我 ...

  3. pytest文档4-Allure报告清除上一次数据

    前言 大家在执行过几次Allure之后就会发现,Allure的报告会把历史的执行结果都展示出来,但实际工作中我们可能只关心本次的结果,解决的话就需要修改一下执行命令了. 问题: 例如图中显示的第一条其 ...

  4. 学习 | css3基本动画之demo篇

    移动端使用的框架是zepto,但是zepto的内置对象没有传统的animate这个方法,效果都是需要css3来实现的,zepto也不支持fadeIn和fadeOut等一些基本的动画,基于这一现状,我自 ...

  5. 关于Java的编译执行与解释执行

    编程语言分为低级语言和高级语言,机器语言.汇编语言是低级语言,C.C++.java.python等是高级语言. 机器语言是最底层的语言,能够直接执行.而我们编写的源代码是人类语言, 计算机只能识别某些 ...

  6. 骚操作:不重启 JVM,如何替换掉已经加载的类?

    Java对象行为 java.lang.instrument.Instrumentation 直接操作字节码 BTrace Arthas 三生万物 在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在 ...

  7. domReady的理解

    domReady的理解 domReady是名为DOMContentLoaded事件的别称,当初始的HTML文档被完全加载和解析完成之后,DOMContentLoaded事件被触发,而无需等待样式表.图 ...

  8. 朴素版和堆优化版dijkstra和朴素版prim算法比较

    1.dijkstra 时间复杂度:O(n^2) n次迭代,每次找到距离集合S最短的点 每次迭代要用找到的点t来更新其他点到S的最短距离. #include<iostream> #inclu ...

  9. 【FastDFS】小伙伴们说在CentOS 8服务器上搭建FastDFS环境总报错?

    写在前面 在[冰河技术]微信公众号的[分布式存储]专题中,我们分别搭建了单节点FastDFS环境和高可用FastDFS集群环境.但是,之前的环境都是基于CentOS 6.8服务器进行搭建的.很多小伙伴 ...

  10. vscode链接git拉取项目

    vscode终端中就可操作 初始化 git  init 链接 git git remote add origin http://**************.git 拉取项目 git clone ht ...