hdu 4352 数位dp+nlogn的LIS
2015-05-06 17:04
274 查看
题意:求区间L到R之间的数A满足A的的数位的最长递增序列的长度为K的数的个数。
链接:点我
该题的关键是记录LIS的状态,学习过nlogn解法的同学都知道,我们每次加入的元素要和前面的比对替换,这里就用了这个方法
比如1 3 6,用二进制表示为001000101,假如新加入的数为2,那么我们枚举比2大的数,观察是否存在,这里找到3,我们把3替换成2,状态变成1,2,6
不懂的童鞋可以看这里的nlogn的介绍:点我
还有就是注意前导0
链接:点我
该题的关键是记录LIS的状态,学习过nlogn解法的同学都知道,我们每次加入的元素要和前面的比对替换,这里就用了这个方法
比如1 3 6,用二进制表示为001000101,假如新加入的数为2,那么我们枚举比2大的数,观察是否存在,这里找到3,我们把3替换成2,状态变成1,2,6
不懂的童鞋可以看这里的nlogn的介绍:点我
还有就是注意前导0
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using namespace std; #define MOD 1000000007 typedef long long ll; const int INF=0x3f3f3f3f; const double eps=1e-5; #define cl(a) memset(a,0,sizeof(a)) #define ts printf("*****\n"); const int MAXN=1005; int n,m,tt,K; ll dp[20][1<<11][11]; int digit[20]; int k; ll getst(ll s,ll u,ll& xx) // 状态转移 { ll i,ss; for(i=u;i<10;i++) { if(s&(1<<i)) break ; //有比u大的,替换掉 } if(i<10) { ss=s^(1<<i); ss=ss^(1<<u); } else //没有比u大的,u放入s中 { xx++; ss=s^(1<<u); } return ss; } ll dfs(int p,ll s,ll len,int fl,bool e) { //位置,lis状态,lis长度,前导0 if (p==-1) return len==k; if (!e &&dp[p][s][k]!=-1) return dp[p][s][k]; ll res = 0; int u=e?digit[p]:9; for (int i=0;i<=u;++i) { ll ns,nlen=len; if(fl==0&&i==0) ns=0; else ns=getst(s,i,nlen); res+=dfs(p-1,ns,nlen,fl||i!=0,e&&i==u); } return e?res:dp[p][s][k]=res; } ll solve(ll n) { int len=0; while(n) { digit[len++]=n%10; n/=10; } return dfs(len-1,0,0,0,1); } int main() { int i,j; #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); #endif scanf("%d",&tt); int ca=0; memset(dp,-1,sizeof(dp)); while(tt--) { ll l,r; scanf("%I64d%I64d%I64d",&l,&r,&k); ll ans=solve(r)-solve(l-1); printf("Case #%d: %I64d\n",++ca,ans); } }
相关文章推荐
- hdu 4352 XHXJ's LIS(数位dp进阶,LIS, 状态压缩)
- 【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)
- HDU 4352 XHXJ's LIS ★(数位DP)
- 【hdu】4352 XHXJ's LIS【状压+数位dp】
- 数位DP——HDU 4352 XHXJ's LIS
- HDU 4352 数位DP + LIS
- 数位dp+LIS+状态压缩-hdu-4352-XHXJ's LIS
- hdu 4352 XHXJ's LIS(LIS+数位DP,5级)
- HDU-4352-数位dp,LIS
- HDU 4352 XHXJ's LIS 数位dp+lis
- hdu 4352 XHXJ's LIS(LIS+数位DP,5级)
- HDU 4352 XHXJ's LIS(数位DP+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