题目大意

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. seajs1.3.0源码解析之module依赖有序加载

    /** * The core of loader */ ;(function(seajs, util, config) { // 模块缓存 var cachedModules = {} // 接口修改 ...

  2. Coneology(POJ 2932)

    原题如下: Coneology Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4937   Accepted: 1086 D ...

  3. python中绝对值的表达式

    abs(x) print(abs(23)) #23print(abs(-45)) #45  

  4. get、post请求方式区别

    1.get请求只有请求头,没有请求体,它的参数只能写在url里面,post请求数据放在请求体里面 (HTTP协议:两台电脑交互url请求头Request Headers:一些额外的信息,比如用的什么浏 ...

  5. pycharm安装模块方法

    一. 打开pycharm 二. 点开file 三. 点击Settings,点击Project Interpreter,选择右上角+ 四. 进入后,在搜索框搜索需要安装的模块,选中安装 击Project ...

  6. ulimit 的认识

    原文出自 通过 ulimit 改善系统性能 概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时 ...

  7. WebGL之延迟着色

    什么是延迟着色(Deferred Shading)?它是相对于正常使用的正向着色(Forward Shading)而言的,正向着色的工作模式:遍历光源,获取光照条件,接着遍历物体,获取物体的几何数据, ...

  8. Linux实战(11):配置PPPOE拨号

    前言: 由于需要做网站数据的抓取,普通的固定代理会容易被封禁,所以我们就用PPPOE通过动态拨号换不同的IP地址来解决该问题,下面PPPOE设置的整个方法过程: 移除NetworkManager安装r ...

  9. mysql之慢日志查询

    转自https://my.oschina.net/wuweixiang/blog/2987434 首先得配置my.cnf: #===================================== ...

  10. iOS多线程之超实用理论+demo演示(可下载)

    目录 背景简介 GCD.OperationQueue 对比 核心理念 区别 GCD 队列 串行队列(Serial Queues) 并发队列(Concurrent Queues) 串行.并发队列对比图 ...