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;
    }
  • 相关阅读:
    DS博客作业02--栈和队列
    DS博客作业02--线性表
    c博客06-结构
    c博客作业05--指针
    C博客作业04--数组
    博客作业03-函数
    循环结构
    c博客作业01--分支、顺序结构
    我的第一篇博客
    Macos安装JDK1.8
  • 原文地址:https://www.cnblogs.com/WindFreedom/p/9482092.html
Copyright © 2011-2022 走看看