数位dp题;也是我做的第一个数位dp的题目;
感觉数位dp的模板性很强啊,思想都差不太多!
有几个写的很好的参考资料:
推荐一下:
我的代码:
1 #include<cstdio> 2 #include<cstring> 3 #define maxn 16 4 #define ll long long 5 using namespace std; 6 7 int dp[maxn][5000]; 8 int d[maxn],sum; 9 10 ll dfs(int w,int he,bool flag) 11 { 12 if(he<0)return 0; 13 if(!w)return 1; 14 if(!flag&&dp[w][he]!=-1) return dp[w][he]; 15 int ff=flag?d[w]:9; 16 ll ret=0; 17 for(int i=0; i<=ff; i++) 18 ret+=dfs(w-1,he-i*(1<<(w-1)),flag&&i==ff); 19 if(!flag)dp[w][he]=ret; 20 return ret; 21 } 22 23 ll calc(ll b) 24 { 25 memset(d,0,sizeof d); 26 int n=0; 27 while(b) 28 { 29 d[++n]=b%10; 30 b/=10; 31 } 32 return dfs(n,sum,true); 33 } 34 35 int getsum(ll a) 36 { 37 int s=0,ji=1; 38 while(a) 39 { 40 s+=((a%10)*ji); 41 a/=10; 42 ji<<=1; 43 } 44 return s; 45 } 46 47 int main() 48 { 49 int t,ca=1; 50 long long a,b; 51 scanf("%d",&t); 52 memset(dp,-1,sizeof dp); 53 while(t--) 54 { 55 scanf("%I64d%I64d",&a,&b); 56 sum=getsum(a); 57 printf("Case #%d: %I64d ",ca++,calc(b)); 58 } 59 return 0; 60 }