zoukankan      html  css  js  c++  java
  • hdu3734(数位dp,相减抵消影响)

    src:http://acm.hdu.edu.cn/showproblem.php?pid=4734

    注意dp的状态定义,第二个参数用all-sum,是因为这样就可以不用每个case重复memset dp,因为all-sum就消去了每次all值不同的影响!!!

    ac代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define per(i,a,b) for(int i=a;i <= b;i++)
    #define max(a,b) a=max(a,b)
    #define min(a,b) a=min(a,b)
    #define sz(x) (int)x.size()
    typedef long long ll;
    ll gcd(ll a,ll b){while(b){ll t=b;b=a%b;a=t;}return a;}
    const int inf=0x3f3f3f3f;
    const int mod=1000000007;
    #define siz 40005
    int T,A,B,pos,a[15],all,dp[15][4600];
    int f(int u)
    {
        if(u==0)return 0;
        return u%10+2*f(u/10);
    }
    int dfs(int pos,int sum,bool limit)
    {   //dp第二个参数用all-sum是因为这样每个case就不用重复memset了!!!妙啊!
        if(sum>all)return 0;
        if(pos==-1)return 1;
        if(!limit&&dp[pos][all-sum]!=-1)return dp[pos][all-sum];
        int up=limit?a[pos]:9;
        int ans=0;
        for(int i=0;i<=up;i++){
            ans+=dfs(pos-1,sum+i*(1<<pos),limit&&i==a[pos]);
        }
        if(!limit)dp[pos][all-sum]=ans;
        return ans;
    }
    int solve(int u)
    {
        pos=0;
        while(u){
            a[pos++]=u%10;
            u/=10;
        }
        return dfs(pos-1,0,true);
    }
    
    int main()
    {
        memset(dp,-1,sizeof(dp));
        scanf("%d",&T);
        for(int cas=1;cas<=T;cas++){
            scanf("%d %d",&A,&B);
            all=f(A);
            printf("Case #%d: ",cas);
            printf("%d
    ",solve(B));
        }
        return 0;
    }
  • 相关阅读:
    牛客算法周周练2
    牛客算法周周练2
    2020年7月7日Java学习日记
    2020年7月6日Java学习日记
    练习29--if语句
    练习28--布尔练习
    练习27--记忆逻辑
    第18~19讲课后作业
    第20讲:内嵌函数和闭包
    练习25--更多更多练习
  • 原文地址:https://www.cnblogs.com/WindFreedom/p/9482092.html
Copyright © 2011-2022 走看看