hdu4352(状态压缩+LIS+数位dp)
2017-08-11 23:09
429 查看
题解:然后求l-r有多个个位数能组成最大上升序列有k
题解:一维表示位数,二维表示0-9上升序列有哪几个,三位表示前缀是不是0四位表示上升长度
然后转移方程如下:
当位数到达第pos为的时候,如果dp[pos][have][pre][k]如果不是这个上限的话就可以根据记忆化搜索记录一下
题解:一维表示位数,二维表示0-9上升序列有哪几个,三位表示前缀是不是0四位表示上升长度
然后转移方程如下:
当位数到达第pos为的时候,如果dp[pos][have][pre][k]如果不是这个上限的话就可以根据记忆化搜索记录一下
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; typedef long long int ll; ll dp[21][1<<10][2][11]; int bit[30]; int a[30]; int getnext(int n,int k,int pre){ if(!pre) return 1<<k; int cnt = 0; for(int i = 0; i < 10; i++) if(n&(1<<i)) a[cnt++] = i; int p = lower_bound(a,a+cnt,k)-a; a[p] = k; cnt += p==cnt; int have = 0; for(int i = 0; i < cnt; i++) have += (1<<a[i]); return have; } int getlen(int n){ int len = 0; while(n){ if(n&1) len++; n /= 2; } return len; } ll dfs(int pos,int have,int pre,int k,bool lim){ if(pos<=0) return getlen(have)==k; if(!lim&&dp[pos][have][pre][k]!=-1) return dp[pos][have][pre][k]; int num = lim?bit[pos]:9; ll ans = 0; for(int i = 0; i <= num; i++) ans += dfs(pos-1,getnext(have,i,pre),pre||i!=0,k,lim&&i==num); //cout<<ans<<endl; if(!lim) dp[pos][have][pre][k] = ans; return ans; } ll calc(ll n,int k){ int len = 0; while(n){ bit[++len] = n%10; n/=10; } // cout //cout<<len<<endl; return dfs(len,0,0,k,1); } int main(){ int t; memset(dp,-1,sizeof(dp)); scanf("%d",&t); ll l,r; int k; for(int casei = 1; casei <= t; casei++){ scanf("%I64d%I64d%d",&l,&r,&k); printf("Case #%d: %I64d\n",casei,calc(r,k)-calc(l-1,k)); } return 0; }
相关文章推荐
- hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)
- 数位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进阶,LIS, 状态压缩)
- HDU 4352 XHXJ's LIS (数位DP+LIS+状态压缩)
- hdu4352 XHXJ's LIS 数位DP+状态压缩
- 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)
- hdu4352---XHXJ's LIS(状态压缩数位dp)
- hdu4352(数位dp+状态压缩)
- hdu 4352 状态压缩+数位DP
- hdu 4352 状态压缩+数位DP
- HDU4352 lis+状压+数位dp
- hdu 4352 状态压缩+数位DP
- HDU 4352 XHXJ's LIS(状态压缩+数位dp)
- hdu 4352 状态压缩+数位DP
- hdu 4352 状态压缩+数位DP
- HDU - 4352 XHXJ's LIS(数位DP+状态压缩)
- HDU 4352 XHXJ's LIS(数位dp&状态压缩)
- hdu 4352 状态压缩+数位DP