hdu4734(记忆化搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734

思路:记忆化搜索。

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 using namespace std;

 6 int Pow[11];

 7 int dp[11][5050];

 8 int digit[11];

 9 int a,b;

10 

11 int Get_f(int n)

12 {

13     int pos=0,res=0;

14     while(n){

15         digit[pos++]=n%10;

16         n/=10;

17     }

18     for(int i=0;i<pos;i++)res+=digit[i]*Pow[i];

19 //    cout<<res<<"**"<<endl;

20     return res;

21 }

22 

23 int dfs(int pos,int res,int doing)

24 {

25     if(res<0)return 0;

26     if(pos==-1)return 1;

27     if(!doing&&dp[pos][res]!=-1)return dp[pos][res];

28     int End=doing?digit[pos]:9;

29     int ans=0;

30     for(int i=0;i<=End;i++){

31         ans+=dfs(pos-1,res-i*Pow[pos],doing&&i==End);

32     }

33     if(!doing){

34         dp[pos][res]=ans;

35     }

36     return ans;

37 }

38 

39 int Solve(int res,int n)

40 {

41     int pos=0;

42     while(n){

43         digit[pos++]=n%10;

44         n/=10;

45     }

46     return dfs(pos-1,res,1);

47 }

48 

49 int main()

50 {

51     memset(dp,-1,sizeof(dp));

52     Pow[0]=1;

53     for(int i=1;i<=10;i++)Pow[i]=Pow[i-1]<<1;

54     int _case,t=1;

55     scanf("%d",&_case);

56     while(_case--){

57         scanf("%d%d",&a,&b);

58         printf("Case #%d: ",t++);

59         printf("%d\n",Solve(Get_f(a),b));

60     }

61     return 0;

62 }
View Code

 

你可能感兴趣的:(HDU)