zoukankan      html  css  js  c++  java
  • Balanced Numbers数位dp

    三进制搞下, 0  表示没出现过,  第i位为1 表示 i出现了奇数次,  2表示i 出现了偶数次。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string>
    #include <iostream>
    #include <map>
    #include <cstdlib>
    #include <list>
    #include <set>
    #include <queue>
    #include <stack>
    #include<math.h>
    using namespace std;
    typedef long long LL;
    LL dp[20][101111];
    int up[11111];
    int judge(int x)
    {
        int ans=0; int a[10];
        memset(a,0,sizeof(a));
        while(x){
            a[ans++]=x%3;
            x/=3;
        }
        for(int i = 0 ;i< ans;i++){
            if(a[i]==1&&(i&1)) return 0 ;
            if(a[i]==2&&!(i&1)) return 0;
        }
        return 1;
    }
    int change(int x,int i)
    {
        int ans=0 ;int a[10];
        memset(a,0,sizeof(a));
        while(x){
            a[ans++]=x%3; x/=3;
        }
        if(a[i]==0) a[i]=1;
        else
        if(a[i]==1) a[i]=2;
        else
        if(a[i]==2) a[i]=1;
        int ans1=0;
        for(int i = 9;i>=0;i--)
            ans1=ans1*3+a[i];
        return ans1;
    }
    
    LL gao(int now,int gaojici,int first,int flag)
    {
        if(now<=0) return judge(gaojici);
        if(!flag&&~dp[now][gaojici]) return dp[now][gaojici];
        LL limit = flag? up[now]: 9,ret=0;
        for(LL i= 0;i<=limit;i++){
            LL kk=change(gaojici,i);
            ret+=gao(now-1,(first||i)?kk:0,first||i,flag&&limit==i);
        }
        return flag? ret: dp[now][gaojici]=ret;
    }
    LL solve(LL x)
    {
        int  len=0;
        while(x){
            up[++len]= x%10;
            x/=10;
        }
        return gao(len,0,0,1);
    }
    int main()
    {
        int Icase;LL  b;LL a;
        memset(dp,-1,sizeof(dp));
        scanf("%d",&Icase);
        while(Icase--){
            cin>>a>>b;
            cout<<solve(b)-solve(a-1)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    7.15--7.19学习小结
    关于CStdioFile的使用问题
    【EOJ Monthly 2018.7】【D数蝌蚪】
    【HDOJ1051】【排序+LIS】【贪心】
    【HDOJ1045】【DFS】
    【递推】【HDOJ】
    【带权并查集】【HDOJ】
    【次小生成树】【Kruskal】【prim】【转】
    【HDOJ4857】【反向拓扑排序】
    【HDOJ1069】【动态规划】
  • 原文地址:https://www.cnblogs.com/yigexigua/p/3901673.html
Copyright © 2011-2022 走看看