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

    题意:  给出求ab之间有多少个平衡数   4139为平衡数   以3为轴   1*1+4*2==9*1 

    思路很好想但是一直wa  :

    注意要减去前导零的情况 0 00 000 0000   不能反复计算

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    #define N 3700+5
    #define MID N/2
    ll dp[20][20][N];
    ll a[20];
    ll dfs(int pos,int t,int state,bool lead,bool limit  )
    {
        if(!pos)return state==0;
    
        if(!limit&&!lead&&dp[pos][t][state+MID]!=-1)return dp[pos][t][state+MID];
        ll ans=0;
        int up=limit?a[pos]:9;
        rep(i,0,up)
        {
            ans+=dfs(pos-1,t,state+i*(pos-t), lead&&i==0,limit&&i==a[pos]);
        }
        if(!limit&&!lead)dp[pos][t][state+MID]=ans;
        return ans;
    }
    
    ll solve(ll x)
    {
        int pos=0;
        ll ans=0;
        while(x)
        {
            a[++pos]=x%10;
            x/=10;
        }
        rep(i,1,pos)
        ans+=dfs(pos,i,0,true,true);
        return ans-pos+1;//去除前导零
    }
    int main()
    {
        int cas;
        CLR(dp,-1);
        RI(cas);
        while(cas--)
        {
            ll a,b;
            cin>>a>>b;
            printf("%lld
    ",solve(b)-solve(a-1));
        }
        return 0;
    }
    View Code

    或者

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    #define N 3700+5
    #define MID N/2
    ll dp[20][20][N];
    ll a[20];
    ll dfs(int pos,int t,int state,bool lead,bool limit  )
    {
        if(!pos)return !lead&&state==0;
    
        if(!limit&&!lead&&dp[pos][t][state+MID]!=-1)return dp[pos][t][state+MID];
        ll ans=0;
        int up=limit?a[pos]:9;
        rep(i,0,up)
        {
            ans+=dfs(pos-1,t,state+i*(pos-t), lead&&i==0,limit&&i==a[pos]);
        }
        if(!limit&&!lead)dp[pos][t][state+MID]=ans;
        return ans;
    }
    
    ll solve(ll x)
    {
        if(x<0)return 0;
        if(x==0)return 1;
        int pos=0;
        ll ans=0;
        while(x)
        {
            a[++pos]=x%10;
            x/=10;
        }
        rep(i,1,pos)
        ans+=dfs(pos,i,0,true,true);
        return ans+1;//去除前导零
    }
    int main()
    {
        int cas;
        CLR(dp,-1);
        RI(cas);
        while(cas--)
        {
            ll a,b;
            cin>>a>>b;
            printf("%lld
    ",solve(b)-solve(a-1));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Centos 7 LVM xfs文件系统修复
    Feign报错'xx.FeignClientSpecification', defined in null, could not be registered.
    IDEA提示不区分大小写设置
    基于SpringBoot的多模块项目引入其他模块时@Autowired无法注入其他模块stereotype注解类对象的问题解决
    docker安装mysql
    [转]【收藏】用消息队列和消息应用状态表来消除分布式事务
    临时修改当前crontab编辑器
    golang处理 json中非法字符
    nsq里面WaitGroups两种实用的用法
    golang zlib 压缩,解压缩
  • 原文地址:https://www.cnblogs.com/bxd123/p/10719842.html
Copyright © 2011-2022 走看看