zoukankan      html  css  js  c++  java
  • 【数位dp入门】【HDU4734】F(x)

    记录减的状态,表示还要凑多少才能达到当前值。

    然后进行枚举即可。注意状态数不能重复。

    #include<bits/stdc++.h>
    #define N 10010
    using namespace std;
    int dp[12][N],a[N],val;
    int f(int x){
        if(!x)return 0;
        return f(x/10)*2+(x%10);
    }
    int dfs(int x,int sum,int lim){
        if(x==-1)return sum<=val;if(sum>val)return 0;
        if(!lim&&dp[x][val-sum]!=-1)return dp[x][val-sum];
        int maxv=lim?a[x]:9;int ret=0;
        for(int i=0;i<=maxv;i++)
            ret+=dfs(x-1,sum+i*(1<<x),lim&&i==a[x]);
        if(!lim)dp[x][val-sum]=ret;
        return ret;
    }
    inline int read(){
        int f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    inline int work(int x){
        int len=0;
        while(x){a[len++]=x%10;x/=10;}
        return dfs(len-1,0,1);
    }
    int main(){
        int T=read(),cnt=0;
        memset(dp,-1,sizeof(dp));
        while(T--){
            int x=read(),r=read();
            val=f(x);
            printf("Case #%d: %d
    ",++cnt,work(r));
        }
    }
  • 相关阅读:
    redis 学习导航
    springcloud用法
    springcloud-概念
    倒排索引思想
    Java多线程编程实战读书笔记(一)
    java多线程中的三种特性
    汇编语言笔记
    同步/异步和阻塞/非阻塞
    乐观锁和悲观锁
    双亲委派模型
  • 原文地址:https://www.cnblogs.com/zcysky/p/6991246.html
Copyright © 2011-2022 走看看