hdu4352-XHXJ's LIS状压DP+数位DP】的更多相关文章

传送门 题目大意: 求[l, r]中数位的最长上升序列恰好为k的数的个数. 题目分析: 首先要理解\(o(nlogn)\)求LIS问题的思路,每次寻找第一个大于等于的数将其更改. 设dp[pos][sta][k]表示第pos位,sta见后,加入k是为了初始化减少后面的时间. sta表示前pos位的LIS,是一个2进制数,1~10位表示0~9是否被选,比如现在状态是0010100000,就是说LIS是2,4,分两种情况: 现在加入一个数字3,用LIS的方法找到第一个大于等于3的数----4,将其置…
统计$[L,R]$内LIS长度为$k$的数的个数,$Q \le 10000,L,R < 2^{63}-1,k \le 10$. 首先肯定是数位DP.然后考虑怎么做这个dp.如果把$k$记录到状态里没有用.需要找到有效方法统一的表示前面填好的数的特点方便之后的填数. 回顾LIS过程,当前数结尾的LIS是前面比他小的数的LIS中的max+1,但是没有办法记录下来,因为如果记录下前面以数字$0\sim 9$结尾的maxLIS的话空间不够. 尝试换一种表示方法.回顾LIS的$O(nlogn)$做法,发现…
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门  原题目描述在最下面.  在区间内把整数看成一个阿拉伯数字的集合,此集合中最长严格上升子序列的长度为k的个数. 思路:  看了大神的博客感觉这东西是真难想到.状压dp预处理状态,数位dp计算答案.  nex[i][j]表示在状态i(状态i的二进制中为1表示这个数存在LIS中,反之不存在),选取加入第j的数字之后的状态.  然后这题k最大也只有10,因为只有10个数字.所以状态只有1024种.这题还要处理一下前导0. AC代码:…
#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, xh…
题目传送门 XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4246    Accepted Submission(s): 1772 Problem Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 题目大意: 求区间 \([L,R]\) 范围内最长上升子序列(Longest increasing subsequence,简称LIS)长度为 \(k\) 的数的数量. 举个例子: \(123\) 的LIS只有一个\(123\),所以它的LIS的长度是 \(3\): \(101\) 的LIS只有一个\(01\),所以它的LIS的长度是 \(2\): \(132\) 的LIS有\(13\)和\(…
题目链接: http://codeforces.com/problemset/problem/401/D D. Roman and Numbers time limit per test4 secondsmemory limit per test512 megabytes 问题描述 Roman is a young mathematician, very famous in Uzhland. Unfortunately, Sereja doesn't think so. To make Sere…
题意: 有n种卡片,每包面里面,可能有一张卡片或没有,已知每种卡片在面里出现的概率,求获得n种卡片,需要吃面的包数的期望 分析: n很小,用状压,以前做状压时做过这道题,但概率怎么推的不清楚,现在看来就是基本的概率dp dp[s]表示获得卡片种数情况是s时期望包数,dp[(1<<n)-1]=0,dp[0]就是答案 dp[s]=sum(dp[s+(1<<j)]*p[j])+1+(1-tmp)*dp[s](tmp是未吃到的卡片的概率和) 移项化简即可 #include <map&…
作者:zifeiy 标签:状压DP,子集划分DP 题目链接:https://codeforces.com/contest/1238/problem/E 题目大意: 给你一个长度为 \(n(n \le 10^5)\) 的字符串s和 \(m(m \le 20)\) ,这个字符串由前 \(m\) 个小写字母组成. 现在你要找一个前 \(m\) 个字符的一个排列p,在这个排列p的基础上生成字符串s,并计算总代价. 代价的计算过程是: 比如我现在已经生成了字符串s的前i个字符 \(s_{1..i}\) ,…
期望好题. 发现 \(n\) 非常小,应该要想到状压的. 我们可以先只考虑 0 操作. 最难的还是状态: 我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应点,\(f[S][T]\) 表示从一条边没连到此状态的期望方案数 这样就有转移: \[f[S][T] <- \sum_{s \in S,t \in T}f[S \oplus s][T \oplus t] * p(s, t) \] 也就是说,从没选的点中选俩点连边.不过这可能会算重(先连 \(e_1\…
链接 这个题最不好想到的是状态的保存,也没有几亿的数组让你开,怎么保存前面出现了哪些数字. 题意让你求最长上升子序列的长度为k的数字的数目,可以是不连续的,可以保留一个状态栈,栈顶部依次更新,再保证长度最大的情况下使栈顶元素最小,这样就能保证下次加进来的元素有可能会使长度增加.这个状态就用2进制来表示,1的个数就是最后的长度. #include <iostream> #include<cstdio> #include<cstring> #include<algor…
 数位DP总结 By Wine93 2013.7 1.学习链接 [数位DP] Step by Step   http://blog.csdn.net/dslovemz/article/details/8540340 [总结] 数位统计模板 http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html 2.各人总结领悟 数位DP关键在于状态的设计,设计状态时要考虑当前状态(如dp[pos][s1][s2]),一旦当前状态确定后,pos后…
现在才想到要学数位dp,我是不是很弱 答案是肯定的 以一道自己瞎掰的题为模板 //题: //输入数字n //从0枚举到n,计算这n+1个数中含有两位数a的数的个数 //如12930含有两位数93 #include<cstdio> #include<cstring> #include<iostream> using namespace std; ,a,g1,g2; ][][],lim[]; void init(){ scanf("%d%d",&…
这题是显然的数位$dp$,然而我居然写了一个下午!!! 我们不难想到差分,令$solve(x,y)$表示从第一个数字在区间$[0,x]$,第二个数字在区间$[0,y]$的答案. 不难发现题目中给了你一对$A$,$B$,答案显然为$solve(B,B)-2solve(A-1,B)+solve(A-1,A-1)$. 考虑如何求解$solve(x,y)$函数,令$n=max(len(x),len(y))$,其中$len(p)$表示数字$p$在十进制下的长度(以下的位均代表十进制位). 令$f[i]$表…
LINK:卡尔文球锦标赛 可以先思考一下合法的序列长什么样子. 可以发现后面的选手可以使用前面出现的编号也可以直接自己新建一个队. 其实有在任意时刻i 序列的mex>max.即要其前缀子序列中1~max的值都要出现过. 对于这种数排名的问题 容易想到是在某一位字典序小于要求的字典序 然后后面的随便放. 可以直接枚举这样的位置然后统计.最后可以统计出有多少个比当前要小的. 后续有一个 可以使用a 还有n个人这个样子的dp.总复杂度 \(n^3\) 期望得分50. code #include<bi…
题意 题目链接 Sol 刚开始的思路是\(f[i][j]\)表示到第\(i\)位,LIS长度为\(j\)的方案. 然而发现根本不能转移,除非知道了之前的状态然后重新dp一遍.. 题解,,,挺暴力的把,直接把求LIS过程中的单调栈当成一个状态压进去了.. 自己真是不长记性,明明已经被这个单调栈坑过一次了.. 考虑到\(k\)非常小,于是直接对\(k\)进行状压 设\(f[i][sta][j]\)表示长度为\(i\),单调栈内状态为\(sta\), LIS长度为\(k\)的方案数 最后一维如果是单组…
Problem Description #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…
题意: 有n个节点的图,开始有一些边存在,现在每天任意选择两点连一条边(可能已经连过),求使整个图联通的期望天数. 分析: 由于开始图可以看做几个连通分量,想到了以前做的一个题,一个点代表一个集合(这里是连通分量)进行压缩 dp[i][s]表示最后连接的第i个联通分量,联通状态是s时的期望天数,dp[0][1],即为答案,由于s可能很大,用记忆化搜索 #include <map> #include <set> #include <list> #include <c…
题目链接 题目大意:有S门课程,N名在职教师和M名求职者,每名在职教师或求职者都有自己能教的课程集合以及工资,要求花费尽量少的钱选择一些人,使得每门课程都有至少两人教.在职教师必须选. 可以把“每个课程已经分别有几个人教”作为状态来进行转移,每个人能教的课程集合作为“物品重量”,工资作为“价值”来更新dp值,类似01背包,每放进一个人,从后往前更新即可. 状态的表示可以用三进制编码,为了写起来舒服,我写了个结构体作为状态和编码转换的桥梁,也可以进行状态的“加法运算”,虽然速度比较慢就是了~~ 有…
F 对于一张比赛图,经过缩点,会得到dag,且它一定是transitive的,因此我们能直接把比赛图缩成一个有向链.链头作为一个强连通分量,里面的所有点都是胜利的 定义F(win)表示win集合作为赢家的概率,我们有 \[ans=\sum_{win\in all} F(win)|win| \] 显然win集合内的点构成一个强连通分量,并作为链头.win集合内的点一定向集合外的每个点连边 考虑如何求解F(win) 我们定义H(win)表示在win集合内的点构成的子图中,win集合成为一个强连通分量…
题目 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,…
Description #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…
Prime Switch 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4924 Description There are lamps (uniquely numbered from 1 to N) and K switches. Each switch has one prime number written…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4336 Card Collector Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) 问题描述 In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that,…
题目传送门:580D 题目大意:给你n道菜以及每道菜一个权值,k个条件,即第y道菜在第x道后马上吃有z的附加值,求从中取m道菜的最大权值 看到这道题,我们会想到去枚举,但是很显然这是会超时的,再一看数据范围,n只有18,那么我们就可以用状压去做了,dp数组也还是比较好定义的,dp[i][state]表示现在吃到第i道菜状态为state的最大权值,既然有k个限制条件我们就按每个菜去扩展,然后就是一个裸的状压dp了,记得要开long long #include<iostream> #include…
(上不了p站我要死了,侵权度娘背锅) Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数表示.由于人手不够,食堂每次只能为一个人做菜.做每道菜所需的时间是和前一道菜有关的,若前一道菜的对应的口味是a,这一道为b,则做这道菜所需的时间为(a or b)-(a and b),而做第一道菜是不需要计算时间的.其中,or 和and 表示整数逐…
状压DP 就是状态压缩DP.所谓状态压缩,就是将一些复杂的状态压缩起来,一般来说是压缩为一个二进制数,用01来表示某一元素的状态. 比如一排灯泡(5个) 我们可以用一串二进制01串来表示他们的状态 11111就是全开 00000就是全关 00001就是只开了第五个 00101就是第三和第五个开了 以此类推.....而这个二进制串是可以用一个十进制数表示的 比如31就是11111 ,1就是00001等等,这样我们在遍历的时候就不用将五个灯泡疯狂循环,只需要从0遍历到31即可 大大节省了时空. 这里…
题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接爆搜水过 复杂度O(n^m(吧)) 50pt: n<=100,m<=8 是状压/网络流的复杂度 当然,这题显然是状压 由题可以得出一个很显然但很重要的废话:每行每列只能放0~2个棋子 因此,我们可以考虑写一个3进制的状压DP 设f[i][j]表示第 i 行,每一列的具体情况以三进制的表达形式存在j…
题意:每包干脆面可能开出卡或者什么都没有,一共n种卡,每种卡每包爆率pi,问收齐n种卡的期望 思路:期望求解公式为:$E(x) = \sum_{i=1}^{k}pi * xi + (1 - \sum_{i = 1}^{k}pi) * [1 + E(x)]$,即能转换到x情况的期望+x情况原地踏步的期望. 因为n比较小,我们可以直接状压来表示dp[x]为x状态时集齐的期望.那么显然dp[111111111] = 0.然后我们状态反向求解.最终答案为dp[0]. 然后来看期望的求解:$E(x) =…
题面传送门 注意到这题中宝藏 \(+\) 炸弹个数最多只有 \(8\) 个,故考虑状压,设 \(dp[x][y][S]\) 表示当前坐标为 \((x,y)\),有且仅有 \(S\) 当中的物品被包围在凸多边形内部所走过的最少步数. 考虑转移,枚举与 \((x,y)\) 相邻的点 \((x',y')\).但是 \(S\) 的变化可能有些棘手.这里有一个结论,对于某一点 \((x,y)\),任意引出一条射线,如果它与多边形有奇数个交点,那么 \((x,y)\) 就在多边形内部.由于这里引出的射线可以…