HDU-4352 XHXJ's LIS(数位dp+状压)
来源:互联网 发布:中文域名在线转码程序 编辑:程序博客网 时间:2024/05/17 16:12
B - XHXJ's LIS
HDU - 4352题解:数位dp,考虑到最长上升子序列的O(nlogn)的解法,因为只有0~9共10种数字,可以用状态压缩:二进制下S的第i位如果是1,则表示i已经在子序列里面,如果S中有k个1那么就满足要求。每次更新S时,找到子序列中第一个不小于i的数,把这个数删去再把i放入子序列中。
#include<bits/stdc++.h>using namespace std;typedef long long LL;LL dp[25][1<<11][11];int k,a[25];int getNum(int S){ //得到最长上升自序列的长度 int ret=0; while(S) { if(S&1) ret++; S>>=1; } return ret;}int upSta(int S,int j){ //更新状态 for(int i=j;i<=9;i++) if(S&(1<<i)) return (S^(1<<i))|(1<<j); return S|(1<<j);}LL dfs(int i,int S,int mark){ if(i==0) return getNum(S)==k; if(mark==0&&dp[i][S][k]>=0) return dp[i][S][k]; int mx=mark?a[i]:9; LL ret=0; for(int j=0;j<=mx;j++)ret+=dfs(i-1,S==0&&j==0?0:upSta(S,j),mark&&j==mx); if(mark==0) dp[i][S][k]=ret; return ret;}LL solve(LL x){ int len=0; while(x) {a[++len]=x%10;x/=10;} return dfs(len,0,1);}int main(){ int T; LL l,r; scanf("%d",&T); memset(dp,-1,sizeof(dp)); for(int cas=1;cas<=T;cas++){ scanf("%I64d%I64d%d",&l,&r,&k); printf("Case #%d: %I64d\n",cas,solve(r)-solve(l-1)); } return 0;}
0 0
- 【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】
- 【hdu】4352 XHXJ's LIS【状压+数位dp】
- HDU 4352 XHXJ's LIS(数位DP+状压)
- HDU-4352 XHXJ's LIS(数位dp+状压)
- hdu 4352 XHXJ's LIS(LIS+数位DP,5级)
- 数位dp+LIS+状态压缩-hdu-4352-XHXJ's LIS
- HDU 4352 XHXJ's LIS 数位dp+lis
- hdu 4352 XHXJ's LIS --- 数位dp 状态压缩
- 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+状态压缩)
- oracle 取前N条记录
- 信息化基础知识 典型试题分析
- 前端初探-JavaScript
- APT技术
- asp.net通过js给TextBox赋值
- HDU-4352 XHXJ's LIS(数位dp+状压)
- sso cas4.0改造历程--spring-webflow篇
- C++ cout输出 字符型变量的地址
- 【鸟哥私房菜】第二十章 Linux启动流程分析
- Win32窗体应用程序如何添加资源文件?
- 面试题-华为-空瓶换饮料问题-1
- wifi网络结构(上)
- WebService之XFire和SOAP实例(基于JAVA)
- J2EE异常处理写法总结