HDU4352 XHXJ's LIS(LIS 状压)
题意
Sol
刚开始的思路是\(f[i][j]\)表示到第\(i\)位,LIS长度为\(j\)的方案。
然而发现根本不能转移,除非知道了之前的状态然后重新dp一遍。。
题解,,,挺暴力的把,直接把求LIS过程中的单调栈当成一个状态压进去了。。
自己真是不长记性,明明已经被这个单调栈坑过一次了。。
考虑到\(k\)非常小,于是直接对\(k\)进行状压
设\(f[i][sta][j]\)表示长度为\(i\),单调栈内状态为\(sta\), LIS长度为\(k\)的方案数
最后一维如果是单组数据的话是不必要的。但是考虑到时多组数据,就一起加进来吧。
转移的时候枚举一下这一位放了什么,然后暴力的改一下LIS的状态。
#include<bits/stdc++.h>
#define LL long long
#define int long long
using namespace std;
const int MAXN = 1e5 + 10;
LL T, l, r, K;
int f[64][1 << 10][11];//长度为i,lis为k的方案数
int a[MAXN], num;
int change(int S, int x) {//向状态s中加入一个数x
for(int i = x; i <= 9; i++)
if(S & (1 << i)) {S ^= (1 << i); break;}
return S | (1 << x);
}
int dfs(int now, int lim, int lead, int s) {
// printf("%d %d %d %d\n", now, lim, lead, s);
if(!now) return (__builtin_popcount(s) == K);
if(!lim && f[now][s][K] != -1) return f[now][s][K];
int ans = 0;
for(int i = 0; i <= (lim ? a[now] : 9); i++)
ans += dfs(now - 1, lim && i == a[now], lead && (!i), (lead && (!i)) ? 0 : change(s, i));
if(!lim) f[now][s][K] = ans;
return ans;
}
LL solve(LL x) {
num = 0;
while(x) a[++num] = x % 10, x /= 10;
// cout << num << endl;
dfs(num, 1, 1, 0);
}
main() {
memset(f, -1, sizeof(f));
cin >> T;
for(int i = 1; i <= T; i++) {
cin >> l >> r >> K;
printf("Case #%d: ", i);
cout << solve(r) - solve(l - 1) << endl;
}
return 0;
}
HDU4352 XHXJ's LIS(LIS 状压)的更多相关文章
- 【数位dp+状压】XHXJ 's LIS
题目 define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the enti ...
- hdu 4352 "XHXJ's LIS"(数位DP+状压DP+LIS)
传送门 参考博文: [1]:http://www.voidcn.com/article/p-ehojgauy-ot.html 题解: 将数字num字符串化: 求[L,R]区间最长上升子序列长度为 K ...
- HDU.4352.XHXJ's LIS(数位DP 状压 LIS)
题目链接 \(Description\) 求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\). \(Solution\) 数位DP. 至于怎么求LIS, ...
- 【HDU】4352 XHXJ's LIS(数位dp+状压)
题目 传送门:QWQ 分析 数位dp 状压一下现在的$ O(nlogn) $的$ LIS $的二分数组 数据小,所以更新时直接暴力不用二分了. 代码 #include <bits/stdc++. ...
- hdu4352-XHXJ's LIS状压DP+数位DP
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门 原题目描述在最下面. 在区间内把整数看成一个阿拉伯数字的集合,此集合中最长严格上升子序列的长度为k的个数. 思路: ...
- BZOJ 3864 Hero meet devil (状压DP)
最近写状压写的有点多,什么LIS,LCSLIS,LCSLIS,LCS全都用状压写了-这道题就是一道状压LCSLCSLCS 题意 给出一个长度为n(n<=15)n(n<=15)n(n< ...
- 「BZOJ 5161」最长上升子序列「状压DP」
题意 求一个\(1\sim n\)的排列LIS的期望长度,\(n\leq 28\) 题解 考虑朴素的LIS:\(f[i] = min(f[j]) + 1\) 记\(mx[i]\)为\(f\)的前缀最大 ...
- bzoj5161 最长上升子序列 状压DP(DP 套 DP) + 打表
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5161 题解 回顾一下以前用二分求 LIS 的方法:令 \(f[i]\) 表示长度为 \(i\) ...
- 洛谷 P4484 - [BJWC2018]最长上升子序列(状压 dp+打表)
洛谷题面传送门 首先看到 LIS 我们可以想到它的 \(\infty\) 种求法(bushi),但是对于此题而言,既然题目出这样一个数据范围,硬要暴搜过去也不太现实,因此我们需想到用某种奇奇怪怪的方式 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
随机推荐
- 14、/proc/cpuinfo 文件(查看CPU信息)
转载http://www.cnblogs.com/itcomputer/p/4888438.html /proc/cpuinfo文件分析 根据以下内容,我们则可以很方便的知道当前系统关于CPU.CPU ...
- Leetcode: 67. Add Binary
二进制加法 https://discuss.leetcode.com/topic/33693/another-simple-java public String addBinary(String a, ...
- linux命令-stty
一.用途: stty——改变和打印终端行设置 二.参数: 1.打印终端行设置 -a,--all 以人可读的方式打印所有当前设置:-a参数比单独的stty命令输出的终端信息更详细 -g,--save ...
- 怀旧系列(3)----Pascal
Pascal语言是高中时代2000年左右为了参加计算机竞赛学习的一门语言(Turbo Pascal7.0).据说这么语言的结构化非常好,非常适合青少年形成一定的编程思想.但是现在的角度想想都是扯淡,现 ...
- Spring入门第四课
注入参数详解:null值和级联属性 可以使用专用的<null/>元素标签为Bean的字符串或其他对象类型的属性注入null值. 和Struts,Hiberante等框架一样,Spring支 ...
- sql server列转行的几种方法
方法一,临时变量: declare @temp nvarchar(max)='' select @temp=coalesce(@temp,'')+Location+',' from( select d ...
- 自定义进度条PictureProgressBar——从开发到开源发布全过程
自定义进度条PictureProgressBar——从开发到开源发布全过程 出处: 炎之铠邮箱:yanzhikai_yjk@qq.com 本文原创,转载请注明本出处! 本项目JCenter地址:htt ...
- 「模拟赛20180307」三元组 exclaim 枚举+树状数组
题目描述 给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\). 输入 多组数据,第一行数据组数\ ...
- Educational Codeforces Round 48 (Rated for Div. 2) B 1016B Segment Occurrences (前缀和)
B. Segment Occurrences time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 找出list中的不同元素、删除两个list中相同的对象
package com.test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; ...