HDU 4352 XHXJ's LIS(数位dp&状态压缩)
来源:互联网 发布:中国期刊数据库靠谱吗 编辑:程序博客网 时间:2024/06/02 19:43
题目链接:[kuangbin带你飞]专题十五 数位DP B - XHXJ’s LIS
题意
给定区间,求出有多少个数满足最长上升子序列(将数看作字符串)的长度为k。
思路
一个数的上升子序列最大长度为10,所以每一个上升子序列的状态都可以用10个二进制位来表示。
上升子序列的变化可以用LIS的方式来更新。
dp[len][num][k]
len为当前的位,num为当前上升子序列的状态,k表示子序列的长度。
next[s][num]为记录预处理的子序列的状态变化。
cnt [num]记录各个状态的最长上升子序列的长度。
代码
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cstdlib>#include <vector>using namespace std;#define LL long longLL dp[20][1<<10][11];int dis[20];int cnt[1<<10];int nxt[10][1<<10];int getnext(int num, int s){ for(int i=s; i<10; i++) { if(num & (1<<i)) return (num^(1<<i)) | 1<<s; } return num | 1<<s;}LL dfs(int k, int len, int num, bool flag, bool zero){ if(len < 0) return cnt[num] == k; if(!flag && dp[len][num][k]!=-1) return dp[len][num][k]; LL ans = 0; int end = flag?dis[len]:9; for(int i=0; i<=end; i++) ans += dfs(k, len-1, (zero&&i==0)?num:nxt[i][num], flag&&i==end, zero&&i==0); if(!flag) dp[len][num][k] = ans; return ans;}LL solve(LL n, int k){ int pos = 0; while(n) { dis[pos++] = n%10; n /= 10; } return dfs(k, pos-1, 0, 1, 1);}void init(){ memset(dp, -1, sizeof(dp)); for(int i=0; i<1<<10; i++) { cnt[i] = 0; for(int j=0; j<10; j++) { if(i & (1<<j)) cnt[i]++; nxt[j][i] = getnext(i, j); } }}int main(){ int T; scanf("%d", &T); init(); for(int i=1; i<=T; i++) { long long l, r, k; scanf("%lld%lld%lld", &l, &r, &k); printf("Case #%d: %lld\n", i, solve(r, k)-solve(l-1, k)); } return 0;}
0 0
- 数位dp+LIS+状态压缩-hdu-4352-XHXJ's LIS
- hdu 4352 XHXJ's LIS --- 数位dp 状态压缩
- [数位dp+状态压缩] hdu 4352 XHXJ's LIS
- HDU 4352 XHXJ's LIS (数位DP+状态压缩)
- HDU 4352 XHXJ's LIS(数位dp&状态压缩)
- HDU 4352 XHXJ's LIS(状态压缩+数位dp)
- hdu 4352 XHXJ's LIS(数位dp进阶,LIS, 状态压缩)
- HDU 4352 XHXJ's LIS(数位DP+LIS+状态压缩)
- hdu 4352 XHXJ's LIS (数位+状态DP)
- hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)
- 【HDU】4352 XHXJ's LIS 数位DP
- 【数位DP】【hdu 4352】XHXJ's LIS
- HDU 4352 XHXJ's LIS 数位dp
- HDU 4352 XHXJ's LIS(数位DP)
- hdu 4352 XHXJ's LIS(数位dp)
- HDU 4352 XHXJ's LIS【数位DP】
- hdu4352---XHXJ's LIS(状态压缩数位dp)
- hdu4352 XHXJ's LIS 数位DP+状态压缩
- Light OJ 1191 Bar Codes (DP)
- SAE中的日志功能
- atitit.跨语言执行cmd cli api的原理及兼容性设计草案
- Leetcode 004 Median of Two Sorted Arrays
- 操作系统学习1
- HDU 4352 XHXJ's LIS(数位dp&状态压缩)
- JavaWeb项目中的绝对路径与相对路径问题
- Atitit.业务系统的新特性 开发平台 新特性的来源总结
- Atitit.mysql 5.0 5.5 5.6 5.7 新特性 新功能
- 数据结构学习笔记——树的概念
- 全面理解面向对象的 JavaScript
- 架构设计之-逻辑架构
- 大数据应用时Oracle优化方法1
- (p93)k路归并