【状态压缩DP】HDU 4352 XHXJ'S LIS
题目大意
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的更多相关文章
- HDU 4352 XHXJ's LIS 数位dp lis
目录 题目链接 题解 代码 题目链接 HDU 4352 XHXJ's LIS 题解 对于lis求的过程 对一个数列,都可以用nlogn的方法来的到它的一个可行lis 对这个logn的方法求解lis时用 ...
- HDU 4352 XHXJ's LIS HDU(数位DP)
HDU 4352 XHXJ's LIS HDU 题目大意 给你L到R区间,和一个数字K,然后让你求L到R区间之内满足最长上升子序列长度为K的数字有多少个 solution 简洁明了的题意总是让人无从下 ...
- 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 ...
- hdu 4352 XHXJ's LIS (数位dp+状态压缩)
Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully readin ...
- HDU 4352 XHXJ's LIS (数位DP+LIS+状态压缩)
题意:给定一个区间,让你求在这个区间里的满足LIS为 k 的数的数量. 析:数位DP,dp[i][j][k] 由于 k 最多是10,所以考虑是用状态压缩,表示 前 i 位,长度为 j,状态为 k的数量 ...
- hdu 4352 XHXJ's LIS 数位DP+最长上升子序列
题目描述 #define xhxj (Xin Hang senior sister(学姐))If you do not know xhxj, then carefully reading the en ...
- HDU.4352.XHXJ's LIS(数位DP 状压 LIS)
题目链接 \(Description\) 求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\). \(Solution\) 数位DP. 至于怎么求LIS, ...
- HDU 4352 XHXJ's LIS (数位DP,状压)
题意: 前面3/4的英文都是废话.将一个正整数看成字符串,给定一个k,问区间[L,R]中严格的LIS=k的数有多少个? 思路: 实在没有想到字符0~9最多才10种,况且也符合O(nlogn)求LIS的 ...
- 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 ...
随机推荐
- seajs1.3.0源码解析之module依赖有序加载
/** * The core of loader */ ;(function(seajs, util, config) { // 模块缓存 var cachedModules = {} // 接口修改 ...
- Coneology(POJ 2932)
原题如下: Coneology Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4937 Accepted: 1086 D ...
- python中绝对值的表达式
abs(x) print(abs(23)) #23print(abs(-45)) #45
- get、post请求方式区别
1.get请求只有请求头,没有请求体,它的参数只能写在url里面,post请求数据放在请求体里面 (HTTP协议:两台电脑交互url请求头Request Headers:一些额外的信息,比如用的什么浏 ...
- pycharm安装模块方法
一. 打开pycharm 二. 点开file 三. 点击Settings,点击Project Interpreter,选择右上角+ 四. 进入后,在搜索框搜索需要安装的模块,选中安装 击Project ...
- ulimit 的认识
原文出自 通过 ulimit 改善系统性能 概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时 ...
- WebGL之延迟着色
什么是延迟着色(Deferred Shading)?它是相对于正常使用的正向着色(Forward Shading)而言的,正向着色的工作模式:遍历光源,获取光照条件,接着遍历物体,获取物体的几何数据, ...
- Linux实战(11):配置PPPOE拨号
前言: 由于需要做网站数据的抓取,普通的固定代理会容易被封禁,所以我们就用PPPOE通过动态拨号换不同的IP地址来解决该问题,下面PPPOE设置的整个方法过程: 移除NetworkManager安装r ...
- mysql之慢日志查询
转自https://my.oschina.net/wuweixiang/blog/2987434 首先得配置my.cnf: #===================================== ...
- iOS多线程之超实用理论+demo演示(可下载)
目录 背景简介 GCD.OperationQueue 对比 核心理念 区别 GCD 队列 串行队列(Serial Queues) 并发队列(Concurrent Queues) 串行.并发队列对比图 ...