码迷,mamicode.com
首页 > 其他好文 > 详细

【HDOJ】【3709】Balanced Bumber

时间:2015-03-01 23:36:17      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

数位DP


题解:http://www.cnblogs.com/algorithms/archive/2012/09/02/2667637.html

 

dfs的地方没太看懂……(也就那里是重点吧喂!)挖个坑……回头再看看

技术分享
 1 //HDOJ 3709
 2 #include<cmath>
 3 #include<vector>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<iostream>
 8 #include<algorithm>
 9 #define rep(i,n) for(int i=0;i<n;++i)
10 #define F(i,j,n) for(int i=j;i<=n;++i)
11 #define D(i,j,n) for(int i=j;i>=n;--i)
12 #define pb push_back
13 using namespace std;
14 int getint(){
15     int v=0,sign=1; char ch=getchar();
16     while(ch<0||ch>9){ if (ch==-) sign=-1; ch=getchar();}
17     while(ch>=0&&ch<=9){ v=v*10+ch-0; ch=getchar();}
18     return v*=sign;
19 }
20 const int N=20,M=1400;
21 typedef long long LL;
22 /******************tamplate*********************/
23 
24 LL dp[N][N][M];
25 int bit[N];
26 LL dfs(int pos,int o,int sum,int f){
27     if (sum<0) return 0;
28     if (pos==0) return sum==0;
29     if (!f && dp[pos][o][sum]!=-1) return dp[pos][o][sum];
30 
31     LL ret=0;
32     int max=f ? bit[pos] : 9;
33     F(i,0,max)
34         ret+=dfs(pos-1,o,sum+(pos-o)*i,f && i==max);
35     if (!f) dp[pos][o][sum]=ret;
36     return ret;
37 }
38 
39 LL cal(LL n){
40     int len=0;
41     for(;n;n/=10) bit[++len]=n%10;
42     LL ret=0;
43     F(o,1,len)
44         ret+=dfs(len,o,0,1);
45     return ret-len+1;
46 }
47 int main(){
48 #ifndef ONLINE_JUDGE
49     freopen("3709.in","r",stdin);
50     freopen("3709.out","w",stdout);
51 #endif
52     memset(dp,-1,sizeof dp);
53     int T=getint();
54     while(T--){
55         LL x,y;
56         cin >> x >> y;
57         cout << cal(y)-cal(x-1)<<endl;
58     }
59     return 0;
60 }
View Code

 

【HDOJ】【3709】Balanced Bumber

标签:

原文地址:http://www.cnblogs.com/Tunix/p/4307722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!