加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

【HDU】4352 XHXJ's LIS(数位dp+状压)

发布时间:2020-12-14 03:19:49 所属栏目:大数据 来源:网络整理
导读:题目 传送门:QWQ ? ? 分析 数位dp 状压一下现在的$ O(nlogn) $的$ LIS $的二分数组 数据小,所以更新时直接暴力不用二分了。 ? 代码 #include bits/stdc++.h using namespace std;typedef long long ll; const int maxn= 20 ;ll dp[maxn][ 1 11 ][ 12 ]; in

题目

传送门:QWQ

?

?

分析

数位dp

状压一下现在的$ O(nlogn) $的$ LIS $的二分数组

数据小,所以更新时直接暴力不用二分了。

?

代码

#include <bits/stdc++.h>
using namespace std;
typedef  long long ll;
const int maxn=20;
ll dp[maxn][1<<11][12];int k,digit[maxn];
int nextstate(int state,int x){
    for(int i=x;i<10;i++){
        if(state&(1<<i)){
            state^=(1<<i); break;
        }
    }
    return (state|(1<<x));
}
int getnum(int x){
    int ans=0;
    while(x){
        if(x&1) ans++;
        x>>=1;
    }
    return ans;
}
ll dfs(int pos,int state,int leadingzero,int border){
    if(pos==0) return getnum(state)==k;    
    if(!leadingzero && !border && dp[pos][state][k]!=-1) return dp[pos][state][k];
    ll ans=0;
    int end=border?digit[pos]:9;
    for(int i=0;i<=end;i++){
        if(i==0 && leadingzero) ans+=dfs(pos-1,state,1,border&&i==end);
        else ans+=dfs(pos-1,nextstate(state,i),0,border&&i==end);
    }
    if(!leadingzero&&!border) dp[pos][state][k]=ans;
    return ans;
}
ll cal(ll n){
    int pos=0;
    while(n){
        digit[++pos]=n%10; n/=10;
    }
    return dfs(pos,1);
}
int main(){
    int t;ll l,r; cin>>t;
    memset(dp,-1,sizeof(dp));
    for(int i=1;i<=t;i++){
        cin>>l>>r>>k;
        cout<<"Case #"<<i<<": "<<cal(r)-cal(l-1)<<endl;
    }
    return 0;
}
/*
100
1234567 123456789012 8
5678567890101 1234567890123456 9
*/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读