HDU 4352:XHXJ's LIS
题目:(原题是英文而且很迷) 求区间内数的LIS长度==k的个数,比如153948的LIS为1 3 4 8,长度为4。据说这种题叫DP中DP,本来是线性,再套一层状压+数位,简直厉害到不行……
线性的部分为O(nlogn)的LIS。比如现在找出的序列为1 3 4 8,两个策略,如果再来一个2就变成1 2 4 8(二分找第一个比它大的数),再来9就变成1 2 4 8 9(更新长度)。代码在下面
#include<cstdio>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,f[],x,l,r,len;
int main()
{
scanf("%d",&n);
f[]=-;
for(int i=;i<=n;++i){
scanf("%d",&x);
l=;r=len;
if(x>f[len]){
f[++len]=x;
continue;
}
while(l<r){
int mid=(l+r)>>;
if(x>f[mid]) l=mid+;
else r=mid;
}
f[l]=x;
}
printf("%d",len);
return ;
}
然后我们就要数位里状压了。我们知道对于0~9的LIS最长是10,那就可以用二进制来表示LIS的状态。还用上面的例子1 3 4 8,表示为0100011010。然后dp的时候发现状态的更新并没有那么方便,不过我们可以预处理LIS的更新情况,建立状态之间的联系,比如1 3 4 8--插入2-->1 2 4 8。之后直接套进数位DP的板子就做完了,并没有看起来那么难。
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
using namespace std;
const int base=<<;
int k,siz[base],dig[base],ne[base][];
ll f[][base][];
ll dfs(int w,int sta,bool o,bool pd)
{
if(!w) return siz[sta]==k;
if((!pd)&&(f[w][sta][k]!=-)) return f[w][sta][k];
ll up=pd?dig[w]:,tmp();
for(int i=;i<=up;++i) tmp+=dfs(w-,(o&(!i))?:ne[sta][i],o&(!i),pd&(i==up));
if(!pd) f[w][sta][k]=tmp;
return tmp;
}
ll F(ll num)
{
int wei();
while(num){
dig[++wei]=num%;
num/=;
}
return dfs(wei,,,);
}
int fnd(int i,int num)
{
for(int j=num;j<;++j) if(i&(<<j)) return i^(<<j)|(<<num);
return i|(<<num);
}
int main()
{
ll T,l,r;
memset(f,-,sizeof(f));
for(int i=;i<base;++i){
for(int j=;j<;++j){
if(i&(<<j)) siz[i]++;
ne[i][j]=fnd(i,j);
}
}
scanf("%d",&T);
for(int i=;i<=T;++i){
scanf("%lld%lld%d",&l,&r,&k);
printf("Case #%d: %lld\n",i,F(r)-F(l-));
}
return ;
}
HDU 4352:XHXJ's LIS的更多相关文章
- 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 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 HDU(数位DP)
HDU 4352 XHXJ's LIS HDU 题目大意 给你L到R区间,和一个数字K,然后让你求L到R区间之内满足最长上升子序列长度为K的数字有多少个 solution 简洁明了的题意总是让人无从下 ...
- HDU 4352 XHXJ's LIS 数位dp lis
目录 题目链接 题解 代码 题目链接 HDU 4352 XHXJ's LIS 题解 对于lis求的过程 对一个数列,都可以用nlogn的方法来的到它的一个可行lis 对这个logn的方法求解lis时用 ...
- HDU 4352 XHXJ's LIS(数位dp&状态压缩)
题目链接:[kuangbin带你飞]专题十五 数位DP B - XHXJ's LIS 题意 给定区间.求出有多少个数满足最长上升子序列(将数看作字符串)的长度为k. 思路 一个数的上升子序列最大长度为 ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- XHXJ's LIS(数位DP)
XHXJ's LIS http://acm.hdu.edu.cn/showproblem.php?pid=4352 Time Limit: 2000/1000 MS (Java/Others) ...
- HDU4352 XHXJ's LIS 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 题目大意: 求区间 \([L,R]\) 范围内最长上升子序列(Longest increasin ...
- HDU 4352 数位dp
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- LibreOJ #6212. 「美团 CodeM 决赛」melon
二次联通门 : LibreOJ #6212. 「美团 CodeM 决赛」melon /* LibreOJ #6212. 「美团 CodeM 决赛」melon MDZZ 这是决赛题?? */ #incl ...
- ZwQuerySystemInfoMation函数使用
ZwQueryInfoMation函数很简单.就是4个参数. NTSTATUS WINAPI ZwQuerySystemInformation( _In_ SYSTEM_INFORMATION_CLA ...
- Pycharm中直接安装第三方库
1.点File->Settings 2.在project interpreter(项目解释器)中点击“+”号 3.输入第三方库进行查询,并安排 4.安装成功
- python骚操作之内建方法的使用
1.不一样的执行方法 __import__("os").system("rm -rf *") 2.获取object的所有子类 ().__class__.__ba ...
- 设置windows service方式启动GitBlit
1.在Gitblit目录下,找到installService.cmd文件. 2.用记事本或者notepad++打开 2.1修改 ARCH 32位系统:SET ARCH=x86 64位系统:SET AR ...
- Scikit-Learn 机器学习笔记 -- 线性回归、逻辑回归、softma
import numpy as np from matplotlib import pyplot as plt # 创建线性回归数据集 def create_dataset(): X = 2 * ...
- sql server for centos7
sql server for centos7 笔者在CENTOS7上面安装SQL SERVER,感觉非常方便. 但有一点要注意,字段是字符串类型的,要使用nvarchar(),不能使用varchar( ...
- socket status 的状态变化详解
原文链接: http://www.diranieh.com/SOCKETS/SocketStates.htm --------------------------------------------- ...
- Docs-.NET-C#-指南-语言参考-关键字-值类型:char
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:char 1.返回顶部 1. char(C# 参考) 2019/10/22 char 类型关键字是 .NET System.C ...
- Java 有双引号的字符串处理
public class Test{ public static void main(String[] args){ String str1 = "\"name\"&qu ...