hdu3734(数位dp)
Posted windfreedom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu3734(数位dp)相关的知识,希望对你有一定的参考价值。
src:http://acm.hdu.edu.cn/showproblem.php?pid=4734
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) { 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; }
以上是关于hdu3734(数位dp)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 6156 Palindrome Function 数位DP