hdu4352(数位DP + LIS(nlogn))
题目描述:
给定一个区间中,将区间的每一个数看成一个字符串,求这个区间内每个字符串的最大上升
子序列等于k的个数。
可以采用nlogn的LIS(用一个C数组记录长度为i的最大上升子序列的结尾最小值),
所以可以采用dfs暴力枚举每一个数,并且由于数的长度最大为18位,
所以c数组可以用一个状态数表示。
dp[len][state][k],代表长度为len的数,c数组状态为state,上升子序列长度等于k的个数。
为什么要加k这一维?因为如果有多组询问,k不相同,那么就不能用之前计算过的dp[len][state]状态,
它保存的其实是,上升子序列长度等于之前k的个数。
可以记忆化的理由:分析到如果不同数的前缀对C数组产生的一样,那么两者等价,那么可以记忆化。
个人理解:其实数位DP考虑记忆化,就要从不同前缀对之后len位的影响考虑。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define LL long long
LL dp[][<<][]; //长度为30,最大上升子序列状态为s,是否有等于k的个数
int digit[];
int K;
int bit(int state)
{
int cnt=;
while(state>)
{
if(state & ==)
cnt++;
state>>=;
}
return cnt;
} int solve(int state,int i)
{
int j;
int ok=;
for(j=i;j<=;j++)
{
if(state & (<<j))
{
ok=; break;
}
}
int s;
if(ok==)
s=( state ^ (<<j) )| (<<i);
else
s=state | (<< i);
return s;
} LL dfs(int len,int state,bool z,bool fp)
{
if( len== )
return bit(state)==K;
if(!fp && dp[len][state][K] != -)
return dp[len][state][K];
LL ret = ;
int fpmax = fp ? digit[len] : ;
for(int i=;i<=fpmax;i++)
{
int s=solve(state,i);
ret += dfs(len-,(z&&(i==)) ? : s, z&&(i==) ,fp && i == fpmax);
}
if(!fp)
dp[len][state][K] = ret;
return ret;
} LL f(LL n)
{
int len = ;
while(n)
{
digit[++len] = n % ;
n /= ;
}
return dfs(len,,,true);
} int main()
{
//freopen("test.txt","r",stdin);
LL a,b;
int t,Case=;
scanf("%d",&t);
memset(dp,-,sizeof(dp));
while(t--)
{
scanf("%lld%lld%d",&a,&b,&K);
if(a==b)
printf("Case #%d: %d\n",++Case,);
printf("Case #%d: %lld\n",++Case,f(b)-f(a-));
} return ;
}
hdu4352(数位DP + LIS(nlogn))的更多相关文章
- hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)
#define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the entire ...
- HDU 4352 XHXJ's LIS 数位dp lis
目录 题目链接 题解 代码 题目链接 HDU 4352 XHXJ's LIS 题解 对于lis求的过程 对一个数列,都可以用nlogn的方法来的到它的一个可行lis 对这个logn的方法求解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][LIS问题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- hdu4352 数位dp+状态压缩+一个tip
按照nlogn求lis的方法,把lis的状态压缩了,每次新加一个数就把它右边第一个数的位置置为0,然后把这个数加进去 一个需要注意的地方,如果前面都是0,那么状态s中代表0的位置不可以是1,因为这种情 ...
- HDU 4352 区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K(数位DP+LIS)
题目:区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K 思路:用dp[i][state][j]表示到第i位状态为state,最长上升序列的长度为k的方案数.那么只要模拟nlogn写法的 ...
- HDU 4352 数位dp
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 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$记录到状态 ...
- HDU4352 XHXJ's LIS 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 题目大意: 求区间 \([L,R]\) 范围内最长上升子序列(Longest increasin ...
随机推荐
- hdu 4422
#include<stdio.h> #include<string.h> #define inf 0x7fffffff int main() { int i,j,k, ...
- git push ‘No refs in common and none specified’doing nothing问题解决
git push ‘No refs in common and none specified’doing nothing问题解决 输入git push origin master即可解决问题
- asp.net网页防刷新重复提交、防后退解决办法!
原文发布时间为:2008-10-14 -- 来源于本人的百度文章 [由搬家工具导入] 1、提交后 禁用提交按钮(像CSDN这样)2、数据处理成功马上跳转到另外一个页面! 操作后刷新的确是个问题,你可以 ...
- Object-C Xcode 编译提示 note: please rebuild precompiled header ZWYLPrefixHeader
错误提示如下图 解决思路: 由于手欠不小心,在.pch文件上的第一行加了几个文字,删除以后,还有一个空行,估计是这个空行引起的.删除这个空行,就好了.
- 牛客网暑期ACM多校训练营(第三场)J 多边形与圆相交的面积
链接:https://www.nowcoder.com/acm/contest/141/J 题目描述 Eddy has graduated from college. Currently, he is ...
- CodeForces 599B Spongebob and Joke
简单题. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...
- 动态规划:HDU1087Super Jumping! Jumping! Jumping!(最大上升和)
Problem Description Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very ...
- Java异常错误重试方案研究(转)(spring-retry/guava-retryer)
业务场景 应用中需要实现一个功能: 需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作.这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果:第二步拿 ...
- Eclipse Explorer插件快速打开项目文件在系统资源管理器
官网:https://github.com/Jamling/eclipse-explorer 安装: 1.在线安装 [Help]->[Eclipse Marketplace]搜索:Eclipse ...
- HttpUtils 用于进行网络请求的工具类
原文:http://www.open-open.com/code/view/1437537162631 import java.io.BufferedReader; import java.io.By ...