HDU 4352 XHXJ's LIS ★(数位DP)
题意
求区间[L,R]内满足各位数构成的数列的最长上升子序列长度为K的数的个数。
思路
一开始的思路是枚举数位,最后判断LIS长度。但是这样的话需要全局数组存枚举的各位数字,同时dp数组的区间唯一性也被破坏了(我不知道MYQ10那题怎么被我用这种方法做对的。。。)
看了题解后发现了二进制缩位处理LIS的巧妙方法~~我们用一个长10位的二进制数state表示0~9之前是否出现过,而更新的时候也需要一点技巧:如果我们当前处理到的位数是i,那么我们就找state中不小于i的第一位非0位,把它置0,再把第i位置1。为什么这样处理呢?想想我们更新时的困难,就在于怎样维持state后面1的出现顺序要在前面1的后面,这样最后state中1的个数才表示LIS长度。呐当我们处理i时,对于i后面的1,就不符合出现顺序了,所以需要调整。但是我们发现对于紧接着i的那个1,它可以被i“替换”掉。因为此时以它为结尾和以i为结尾的LIS长度一样(因为是近邻着的下一个1),而它被i“替换”后又不影响了后面1的出现顺序了,把i当成原来的它就行了~
还有一点是,相对于每次询问都初始化dp数组(超时),更好的方法是给dp加一维[11]表示处理的K,这样只需在最开始初始化即可。
代码
[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#define MID(x,y) ((x+y)/2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define REP(i, begin, end) for (int i = begin; i <= end; i ++)
using namespace std;
typedef unsigned long long LL;
typedef vector <int> VI;
VI num;
LL dp[25][2][1050][11];
LL L, R;
int K;
int getnewstate(int x, int s) {
for (int i = x; i < 10; ++i)
if (s&(1<<i)) return (s^(1<<i))|(1<<x);
return s|(1<<x);
}
int get_dig_num(int state){
int res = 0;
for (int i = 0; i <= 9; i ++){
if (state & (1<<i))
res ++;
}
return res;
}
LL dfs(int pos, bool zero, int state, bool limit){
if (pos == -1){
return (get_dig_num(state) == K);
}
if (!limit && ~dp[pos][zero][state][K]) return dp[pos][zero][state][K];
int end = limit?num[pos]:9;
LL res = 0;
for (int i = 0; i <= end; ++ i){
bool next_zero = (zero && i==0);
res += dfs(pos-1, next_zero, next_zero?0:getnewstate(i, state), limit&&(i==end));
}
return limit?res:dp[pos][zero][state][K]=res;
}
LL solve(LL x){
num.clear();
while(x){
num.push_back(x%10);
x /= 10;
}
LL res = dfs(num.size()-1, 1, 0, true);
return res;
}
int main(){
int t;
MEM(dp, -1);
scanf("%d", &t);
REP(ca, 1, t){
scanf("%I64d %I64d %d", &L, &R, &K);
printf("Case #%d: %I64d\n", ca, solve(R)-solve(L-1));
}
return 0;
}
[/cpp]
HDU 4352 XHXJ's LIS ★(数位DP)的更多相关文章
- HDU 4352 XHXJ's LIS 数位dp lis
目录 题目链接 题解 代码 题目链接 HDU 4352 XHXJ's LIS 题解 对于lis求的过程 对一个数列,都可以用nlogn的方法来的到它的一个可行lis 对这个logn的方法求解lis时用 ...
- 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 状压 LIS)
题目链接 \(Description\) 求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\). \(Solution\) 数位DP. 至于怎么求LIS, ...
- 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$
正解:数位$dp$+状压$dp$ 解题报告: 传送门! 题意大概就是港,给定$[l,r]$,求区间内满足$LIS$长度为$k$的数的数量,其中$LIS$的定义并不要求连续$QwQ$ 思路还算有新意辣$ ...
- 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
数位DP!dp[i][j][k]:第i位数,状态为j,长度为k 代码如下: #include<iostream> #include<stdio.h> #include<a ...
- 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 ...
- hdu 4352 XHXJ's LIS(数位dp+状压)
Problem Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefull ...
随机推荐
- Postman中使用Postman Interceptor 发送带Cookie 的请求
使用Postman 发送Cookie 的请求时,发现无法发送成功, 显示"Restricted Header (use Postman Interceptor)" 提示. 网上搜了 ...
- JVM年轻代(转)
本文转自:http://my.oschina.net/xishuixixia/blog/133850 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完 ...
- [转]tomcat之一:指定tomcat运行时JDK版本
今天在做项目的时候,主管让我在本机上启动多个tomcat且指定不同的jdk环境.因为在企业的项目中个,对于同一个服务器中有多个jdk和tomcat,所以就需要手动指定不同的jdk. 在网上找了很多资料 ...
- 【Deep Learning】两层CNN的MATLAB实现
想自己动手写一个CNN很久了,论文和代码之间的差距有一个银河系那么大. 在实现两层的CNN之前,首先实现了UFLDL中与CNN有关的作业.然后参考它的代码搭建了一个一层的CNN.最后实现了一个两层的C ...
- Python3.x:定义一个类并且调用
Python3.x:定义一个类并且调用 1,定一个类Shrjj(其中有属性:name, jjzt,fbsjj,etf,lof,fjlof): class Shrjj(object): def __in ...
- DNS ARP地址解析原理
ARP是地址解析协议 主机A与主机B之间如果要进行数据间的传输,需要获取对方的IP与物理地址(MAC),在只清楚ip的情况下,主机A向主机B请求链接,会先查找ARP高速缓存表,是否存在对应的主机B的i ...
- 关于Linq翻译Inner join ,Left join (本文为转载)
我們先來一段最基本的 LINQ to SQL 使用類似 T-SQL 的 INNER JOIN 資料查詢語法: from c in Categories from o in c.Products sel ...
- 20145331 《Java程序设计》第2次实验报告
20145331 <Java程序设计>第2次实验报告 实验二 Java面向对象程序设计 一.实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步 ...
- Ubuntu 12.04下安装QQ 2012 Beta3
Ubuntu 12.04下安装QQ 2012 Beta3 由于wine的发展非常迅速.现在网上的利用老版本的wine来安装QQ2012的教程已经有些过时了.实际上操作起来非常简单: 第一步:Ctr ...
- openssl 编译
不要费事编译了,直接下载吧! https://www.npcglib.org/~stathis/blog/precompiled-openssl/ 下载 openssl https://www.ope ...