XHXJ's LIS,还是dp
题目:
background:
#define xhxj (Xin Hang senior sister(学姐))
If you do not know xhxj, then carefully reading the entire description is very important.
As the strongest fighting force in UESTC, xhxj grew up in Jintang, a border town of Chengdu.
Like many god cattles, xhxj has a legendary life:
2010.04, had not yet begun to learn the algorithm, xhxj won the second prize in the university contest. And in this fall, xhxj got one gold medal and one silver medal of regional contest. In the next year's summer, xhxj was invited to Beijing to attend the astar onsite. A few months later, xhxj got two gold medals and was also qualified for world's final. However, xhxj was defeated by zhymaoiing in the competition that determined who would go to the world's final(there is only one team for every university to send to the world's final) .Now, xhxj is much more stronger than ever,and she will go to the dreaming country to compete in TCO final.
As you see, xhxj always keeps a short hair(reasons unknown), so she looks like a boy( I will not tell you she is actually a lovely girl), wearing yellow T-shirt. When she is not talking, her round face feels very lovely, attracting others to touch her face gently。Unlike God Luo's, another UESTC god cattle who has cool and noble charm, xhxj is quite approachable, lively, clever. On the other hand,xhxj is very sensitive to the beautiful properties, "this problem has a very good properties",she always said that after ACing a very hard problem. She often helps in finding solutions, even though she is not good at the problems of that type.
Xhxj loves many games such as,Dota, ocg, mahjong, Starcraft 2, Diablo 3.etc,if you can beat her in any game above, you will get her admire and become a god cattle. She is very concerned with her younger schoolfellows, if she saw someone on a DOTA platform, she would say: "Why do not you go to improve your programming skill". When she receives sincere compliments from others, she would say modestly: "Please don’t flatter at me.(Please don't black)."As she will graduate after no more than one year, xhxj also wants to fall in love. However, the man in her dreams has not yet appeared, so she now prefers girls.
Another hobby of xhxj is yy(speculation) some magical problems to discover the special properties. For example, when she see a number, she would think whether the digits of a number are strictly increasing. If you consider the number as a string and can get a longest strictly increasing subsequence the length of which is equal to k, the power of this number is k.. It is very simple to determine a single number’s power, but is it also easy to solve this problem with the numbers within an interval? xhxj has a little tired,she want a god cattle to help her solve this problem,the problem is: Determine how many numbers have the power value k in [L,R] in O(1)time.
For the first one to solve this problem,xhxj will upgrade 20 favorability rate。
Input
First a integer T(T<=10000),then T lines follow, every line has three positive integer L,R,K.(0<L<=R<2 63-1 and 1<=K<=10).
Output
For each query, print "Case #t: ans" in a line, in which t is the number of the test case starting from 1 and ans is the answer.
Sample Input
1
123 321 2
Sample Output
Case #1: 139
题意:
找到从l到r之间所有满足最长上升(严格的)子序列长度为k的数的个数。
分析:
看到这种和数位有关的题,很好想到数位dp,那么数位dp行不行呢?我们来试一试。
当然为了好处理,我们把l到r的个数转换成0到r减去0到l-1的个数,然后再考虑dp。
dp要定义一个存放的数组,(不然就真的是纯暴力了,可能比模拟还慢),其实就是利用某些处理的“相似”性,或者说等价性,然后通过记录减少运算次数,进而优化时间复杂度,那么如何定义数组呢,别急,先分析一下如何dp,我们先想最暴力的dp方式:直接向下dp,记录一下处理出来的数字,最后判断最长上升子序列是不是k,当然,显然这样每个数字都要判断一遍,没有任何优化。
接下来就是要考虑怎么优化了,首先,我们想一想真正影响到结果的有什么,当然,k会影响,剩余的位数会影响,还有什么会影响呢?想一想我们求最长上升子序列怎么求:找一个low数组,记录长度为下标的结尾数字的最小值,说到这里大家可能就想到了:影响的是low数组,是的,并且很显然,如果处理到还剩一个定值位数的序列,最后需要的k相同,并且处理出来的low数组也相同,那么显然,最后得到的结果是相同的。
想到这里,后面就很简单了:怎么存low数组,显然不能开一个数组(要不然判断处理有无处理过要跑一次所有处理过的数组,显然不好),我们想一想这个low数组有什么特殊性。
其实这个low数组有一个非常特殊的地方就是它单增,严格的单增,为什么呢?因为假设有lowx>=lowy并且x<y,那么我们只要从lowy转移的里面找到第x个数放在lowx里,于是有low'x<lowy<=lowx,显然假设不成立(想想low的定义),于是我们证得单调性,于是我们就可以这样记录:一个大小为十数组,如果某一个数为一那么表示low数组里有这个数,这样就会发现一个很好的性质:如果第x个为1的数在数组的第y个里就表示lowx=y-1(数字是0,1,2,3,4,5,6,7,8,9,所有-1),这个数组里有n个1就表示最长上升子序列的长度为n。于是,有什么用呢,不还是数组吗?不一样咯,这样之后数组里只有0和1于是,状态压缩就好了。
说到这里,大家应该想到了,定义Dp[len][s]表示还剩len位未dp,前面处理后low数组的状态是s的处理值,然后递归就好了(当然要伴有有数组的记录),然后就好起来了,当然因为k相同的概率很大:10000组数据k只有10个可取的值,所有再加一维记录当要求位数为k时的值,然后遇到同样的k就可以免掉再一次计算了。
还有一个小小的问题,就是边界,这里要处理两个边界:最大,最大的时候有可能有取不到的值,还有就是0,举个例子:001的0不能取,而101的0可以取所有我们还要记录前面是不是都是0,这一题就解决了。
代码:
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
long long Dp[][(<<)+][];
int w[];
int len;
int k;
int ws(int a){//计算1的个数
int ans=;
while(a){
ans+=(a&);
a>>=;
}
return ans;
}
int JS(int zt,int ji){//更新low
for(int i=ji;i<=;i++)
if(zt&(<<i))
return (zt^(<<i))|(<<ji);
return zt|(<<ji);
}
long long Dfs(int len,int zt,bool lim,bool li){
if(Dp[len][zt][k]!=-&&!lim)//已经处理且不在边界
return Dp[len][zt][k];
if(len==){//到最后一位了
if(ws(zt)==k)
return ;
else
return ;
}
int ma=lim?w[len]:;//注意边界
long long ans=;
for(int i=;i<=ma;i++)
ans+=Dfs(len-,(li&&(i==))?:JS(zt,i),lim&&i==ma,li&&(i==));
if(!lim)
return Dp[len][zt][k]=ans;
else
return ans;
}
long long Cl(long long a){
len=;
while(a){
len++;
w[len]=a%;//记录每一位
a/=;
}
return Dfs(len,,,);
}
int main(){
int t;
scanf("%d",&t);
long long l,r;
memset(Dp,-,sizeof(Dp));
for(int i=;i<=t;i++){
scanf("%lld%lld%d",&l,&r,&k);
printf("Case #%d: %lld\n",i,Cl(r)-Cl(l-));
}
return ;
}
XHXJ's LIS,还是dp的更多相关文章
- HDU 4352 XHXJ's LIS 数位dp lis
目录 题目链接 题解 代码 题目链接 HDU 4352 XHXJ's LIS 题解 对于lis求的过程 对一个数列,都可以用nlogn的方法来的到它的一个可行lis 对这个logn的方法求解lis时用 ...
- XHXJ's LIS(数位DP)
XHXJ's LIS http://acm.hdu.edu.cn/showproblem.php?pid=4352 Time Limit: 2000/1000 MS (Java/Others) ...
- 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问题]
题目链接: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 ...
- HDU.4352.XHXJ's LIS(数位DP 状压 LIS)
题目链接 \(Description\) 求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\). \(Solution\) 数位DP. 至于怎么求LIS, ...
- HDU 4352 XHXJ's LIS ★(数位DP)
题意 求区间[L,R]内满足各位数构成的数列的最长上升子序列长度为K的数的个数. 思路 一开始的思路是枚举数位,最后判断LIS长度.但是这样的话需要全局数组存枚举的各位数字,同时dp数组的区间唯一性也 ...
- HDU 4352 XHXJ's LIS (数位DP+LIS+状态压缩)
题意:给定一个区间,让你求在这个区间里的满足LIS为 k 的数的数量. 析:数位DP,dp[i][j][k] 由于 k 最多是10,所以考虑是用状态压缩,表示 前 i 位,长度为 j,状态为 k的数量 ...
- hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)
#define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the entire ...
- hdu4352 XHXJ's LIS[数位DP套状压DP+LIS$O(nlogn)$]
统计$[L,R]$内LIS长度为$k$的数的个数,$Q \le 10000,L,R < 2^{63}-1,k \le 10$. 首先肯定是数位DP.然后考虑怎么做这个dp.如果把$k$记录到状态 ...
随机推荐
- ant构建Jmeter脚本的build文件配置(build.xml)
使用此构建文件可自动发送邮件 代码如下: <?xml version="1.0" encoding="UTF8"?> <project na ...
- win32 socket http 操作
纯wininet 操作http关键代码如下: HINTERNET hNet = ::InternetOpen(_T("Test"), INTERNET_OPEN_TYPE_DIRE ...
- PHP配合JS导出Excel大量数据
一般使用PHP导出Excel表格都会用PHPExcel,但是当遇到要导出大量数据时,就会导致超时,内存溢出等问题.因此在项目中放弃使用这种方式,决定采用前段生成Excel的方式来解决问题. 步骤如下: ...
- 最后一面挂在volatile关键字上,面试官:重新学学Java吧!
最后一面挂在volatile关键字上,面试官:重新学学Java吧! 为什么会有volatile关键字? volatile: 易变的; 无定性的; 无常性的; 可能急剧波动的; 不稳定的; 易恶化的; ...
- Chrome启动选项
1. Chrome Options 这是一个Chrome的参数对象,在此对象中使用add_argument()方法可以添加启动参数,添加完毕后可以在初始化Webdriver对象时将此Options对象 ...
- SQL去掉重复数据
SELECT vc_your_email,vc_our_ref_or_code INTO #tmp FROM( SELECT vc_your_email,vc_our_ref_or_code,ROW_ ...
- 多语言工作者の十日冲刺<8/10>
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--第八天(05.07) 作业正文 ...
- 如何用 React 构建前端架构
早期的前端是由后端开发的,最开始的时候仅仅做展示,点一下链接跳转到另外一个页面去,渲染表单,再用Ajax的方式请求网络和后端交互,数据返回来还需要把数据渲染到DOM上.写这样的代码的确是很简单.在We ...
- Redis设置并查看最大连接数
在 Redis2.4 中,最大连接数是被直接硬编码在代码里面的,而在2.6版本中这个值变成可配置的. maxclients 的默认值是 10000,你也可以在 redis.conf 中对这个值进行修改 ...
- Snmp扫描-snmpwalk、snmpcheck
SNMp经常被错误配置,是信息的金矿. SNMP服务是使用明文传输的,即使不能通过community进行查询,也有可能使用抓包嗅探的方法得到SNMP数据包中的数据. snmpwalk命令可以查询到很多 ...