hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)
来源:互联网 发布:grub命令行启动linux 编辑:程序博客网 时间:2024/05/19 09:11
题目点我点我点我
题目大意:求L到R中有多少个数符合各位数字组成长度为K的LIS。
解题思路:用LIS的nlogn的方法解,如:
现在LIS是2,5,8,9。最新的是3,然后就把状态更新为2,3,8,9。
又因为只有0-9这10个数字,用二进制状态压缩记录状态。
dp[i][j][k]表示i位数,状态为j时的LIS为k的数量。
除了注意数字的上界外,还必须注意数字位数长度与状态的更新,每换新长度时都必须初始化状态,如:
现在有一个5位数,枚举了5位数后,然后就开始枚举4位数,此时就必须将状态s重置为0,即把最高位看作0。
所以我这里用z记录前面是否都为0,若为真,即这是一个新的长度的数,重置状态s。
/* ***********************************************┆ ┏┓ ┏┓ ┆┆┏┛┻━━━┛┻┓ ┆┆┃ ┃ ┆┆┃ ━ ┃ ┆┆┃ ┳┛ ┗┳ ┃ ┆┆┃ ┃ ┆┆┃ ┻ ┃ ┆┆┗━┓ 马 ┏━┛ ┆┆ ┃ 勒 ┃ ┆ ┆ ┃ 戈 ┗━━━┓ ┆┆ ┃ 壁 ┣┓┆┆ ┃ 的草泥马 ┏┛┆┆ ┗┓┓┏━┳┓┏┛ ┆┆ ┃┫┫ ┃┫┫ ┆┆ ┗┻┛ ┗┻┛ ┆************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>using namespace std;#define rep(i,a,b) for (int i=(a),_ed=(b);i<=_ed;i++)#define per(i,a,b) for (int i=(b),_ed=(a);i>=_ed;i--)const int inf_int = 2e9;const long long inf_ll = 2e18;#define inf_add 0x3f3f3f3f#define mod 1000000007#define LL long long#define ULL unsigned long long#define MS0(X) memset((X), 0, sizeof((X)))#define Sd(X) int (X); scanf("%d", &X)#define Sdd(X, Y) int X, Y; scanf("%d%d", &X, &Y)#define Sddd(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)LL dp[20][1<<10][11];int k;int bit[20];int update(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 getK(int s){ int cnt = 0; while(s) { if(s&1)cnt++; s >>= 1; } return cnt;}LL dfs(int pos,int s,bool e,bool z) //e为上界,z记录前面的是否都为0{ if(!pos)return getK(s) == k; if(!e && dp[pos][s][k]!=-1) return dp[pos][s][k]; int digit = e ? bit[pos] : 9; LL ans = 0; for(int i=0;i<=digit;i++) { ans += dfs(pos-1,(z && (i==0)) ? 0 : update(i,s),e && i==digit,z && (i==0)); } if(!e)dp[pos][s][k] = ans; return ans;}LL solve(LL n){ int len = 0; while(n) { bit[++len] = n%10; n /= 10; } return dfs(len,0,1,1);}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout);Sd(t);int cas = 1;memset(dp,-1,sizeof dp);while(t--) { LL a,b; cin>>a>>b>>k; printf("Case #%d: %I64d\n",cas++,solve(b)-solve(a-1)); } return 0;}
0 0
- hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)
- hdu4352---XHXJ's LIS(状态压缩数位dp)
- hdu4352 XHXJ's LIS 数位DP+状态压缩
- HDU4352 XHXJ's LIS 数位DP+状态压缩
- XHXJ's LIS HDU4352(数位DP)
- hdu4352 XHXJ's LIS 数位DP
- hdu4352 XHXJ's LIS (数位dp)
- hdu4352 XHXJ's LIS(数位Dp)
- 【HDU4352】XHXJ's LIS 数位DP
- hdu4352(状态压缩+LIS+数位dp)
- hdu4352 XHXJ's LIS(数位dp+状压)
- 【HDU4352/ZCMU1781】XHXJ's LIS(数位DP)
- 数位dp+LIS+状态压缩-hdu-4352-XHXJ's LIS
- HDU 4352 XHXJ's LIS(数位DP+LIS+状态压缩)
- hdu4352——XHXJ's LIS(数位DP+状压)
- hdu 4352 XHXJ's LIS --- 数位dp 状态压缩
- [数位dp+状态压缩] hdu 4352 XHXJ's LIS
- HDU 4352 XHXJ's LIS (数位DP+状态压缩)
- 检测80端口是否被占用及如何释放80端口的方法
- 安装Xcode注释插件VVDocumenter-Xcode
- 网站中使用内联框架无法获取已设置好的根目录的问题
- OC 中多参数方法声明
- 全面理解面向对象的 JavaScript
- hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)
- free命令要点
- 将整数A转换为B
- Distortion
- 遍历二叉树
- 【安卓中的缓存策略系列】安卓缓存策略之综合应用ImageLoader实现照片墙的效果
- 常量和变量的区别
- 如何用 tmpwatch 删除某个目录下的特定文件
- Redis基础教程