题目链接[kuangbin带你飞]专题十五 数位DP B - XHXJ’s LIS

题意

给定区间。求出有多少个数满足最长上升子序列(将数看作字符串)的长度为k。

思路

一个数的上升子序列最大长度为10,所以每个上升子序列的状态都能够用10个二进制位来表示。

上升子序列的变化能够用LIS的方式来更新。

dp[len][num][k]

len为当前的位,num为当前上升子序列的状态。k表示子序列的长度。

next[s][num]为记录预处理的子序列的状态变化。

cnt [num]记录各个状态的最长上升子序列的长度。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector> using namespace std; #define LL long long LL dp[20][1<<10][11];
int dis[20];
int cnt[1<<10];
int nxt[10][1<<10]; int getnext(int num, int s)
{
for(int i=s; i<10; i++)
{
if(num & (1<<i))
return (num^(1<<i)) | 1<<s;
}
return num | 1<<s;
} LL dfs(int k, int len, int num, bool flag, bool zero)
{
if(len < 0)
return cnt[num] == k;
if(!flag && dp[len][num][k]!=-1)
return dp[len][num][k];
LL ans = 0;
int end = flag?dis[len]:9;
for(int i=0; i<=end; i++)
ans += dfs(k, len-1, (zero&&i==0)? num:nxt[i][num], flag&&i==end, zero&&i==0);
if(!flag)
dp[len][num][k] = ans;
return ans;
} LL solve(LL n, int k)
{
int pos = 0;
while(n)
{
dis[pos++] = n%10;
n /= 10;
}
return dfs(k, pos-1, 0, 1, 1);
} void init()
{
memset(dp, -1, sizeof(dp));
for(int i=0; i<1<<10; i++)
{
cnt[i] = 0;
for(int j=0; j<10; j++)
{
if(i & (1<<j))
cnt[i]++;
nxt[j][i] = getnext(i, j);
}
}
} int main()
{
int T;
scanf("%d", &T);
init();
for(int i=1; i<=T; i++)
{
long long l, r, k;
scanf("%lld%lld%lld", &l, &r, &k);
printf("Case #%d: %lld\n", i, solve(r, k)-solve(l-1, k));
}
return 0;
}

HDU 4352 XHXJ&#39;s LIS(数位dp&amp;状态压缩)的更多相关文章

  1. XHXJ's LIS HDU - 4352 最长递增序列&数位dp

    代码+题解: 1 //题意: 2 //输出在区间[li,ri]中有多少个数是满足这个要求的:这个数的最长递增序列长度等于k 3 //注意是最长序列,可不是子串.子序列是不用紧挨着的 4 // 5 // ...

  2. Codeforces Round #235 (Div. 2) D. Roman and Numbers (数位dp、状态压缩)

    D. Roman and Numbers time limit per test 4 seconds memory limit per test 512 megabytes input standar ...

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

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

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

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

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

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

  6. 【状态压缩DP】HDU 4352 XHXJ'S LIS

    题目大意 Vjudge链接 定义一个数的内部LIS长度表示这个数每个数位构成的序列的LIS长度,给出区间\([l,r]\),求区间内内部LIS长度为\(k\)的数的个数. 输入格式 第一行给出数据组数 ...

  7. [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)

    [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...

  8. 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 ...

  9. hdu 4352 "XHXJ's LIS"(数位DP+状压DP+LIS)

    传送门 参考博文: [1]:http://www.voidcn.com/article/p-ehojgauy-ot.html 题解: 将数字num字符串化: 求[L,R]区间最长上升子序列长度为 K ...

随机推荐

  1. DEALLOCATE - 删除一个准备好的查询

    SYNOPSIS DEALLOCATE [ PREPARE ] plan_name DESCRIPTION 描述 DEALLOCATE 用于删除前面准备好的查询. 如果你没有明确 DEALLOCATE ...

  2. Linux 控制终端转义和控制序列

    DESCRIPTION 描述 Linux控制台实现了VT102和ECMA-48/ISO 6429/ANSI X3.64终端控制的子集, 这个子集很庞大,当然还有Linux自己私有的控制序列,以改变颜色 ...

  3. java_线程优先级

    线程优先级分为三个等级: MAX_PIORITY:10  优先 MIN_PRIORITY:1 NORM_PRIORITY:5  默认 getPriority:获取优先级 setPriority:设置优 ...

  4. 15数据库与ADO.Net

    数据库与ADO.Net 数据库与ADO.Net 8.1   数据库基本概念 数据库提供了一种将信息集合在一起的方法.数据库应用系统主要由三部分组成:数据库管理系统(DBMS),是针对所有应用的,例如A ...

  5. ruby on rails使用gmail的smtp发送邮件

    参考至http://guides.rubyonrails.org/action_mailer_basics.html 在gmail账户的安全里先开启两步验证(链接:https://myaccount. ...

  6. 真正搞明白Python中Django和Flask框架的区别

    在谈Python中Django框架和Flask框架的区别之前,我们需要先探讨如下几个问题. 一.为什么要使用框架? 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应 ...

  7. 初学数位DP

    所谓数位dp,字面意思就是在数位上进行dp,数位的含义:一个数有个位.十位.百位.千位.等等,数的每一位就是数位. 数位DP一般应用于: 求出给定区间[A,B]内,符合条件P[i]的数 i 的个数. ...

  8. lua报错,看到报错信息有tail call,以为和尾调用有关,于是查了一下相关知识

    尾调用是指在函数return时直接将被调函数的返回值作为调用函数的返回值返回,尾调用在很多语言中都可以被编译器优化, 基本都是直接复用旧的执行栈, 不用再创建新的栈帧, 原理上其实也很简单, 因为尾调 ...

  9. jquery对JSON字符串的解析--eval函数

    jquery eval解析JSON中的注意点介绍----https://www.jb51.net/article/40842.htm

  10. xtu summer individual 3 F - Opening Portals

    Opening Portals Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...