hdu4734 F(x) 数位dp

来源:互联网 发布:激战2一折商城网络延迟 编辑:程序博客网 时间:2024/05/23 20:32

      没写过几个数位dp的题,拿来练练手..dp[i][j]表示在没有高位限制的情况下,枚举到第i位时,余下的权重为j时有多少符合的情况(因为只记录了没有高位限制的情况,所以多组数据间dp数组可以共用)dfs(pos,res,f)分别表示枚举到第pos位,权重还剩下res,高位是否限制的标记f,直接计算一下B的值就好了。

/*=============================================================================#  Author:Erich#  FileName:=============================================================================*/#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <cstring>#include <string>#include <vector>#include <map>#include <queue>#include <stack>#define lson id<<1,l,m#define rson id<<1|1,m+1,rusing namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const ll INF=1ll<<60;const double PI=acos(-1.0);int n,m;int A;int B;int dp[11][20000];int num[11];int f(int x){int len=0;int res=0;for (len=0; x; len++){res+=(x%10)*(1<<len);x/=10;}return res;}int dfs(int pos,int res,bool f){if (pos==-1) return res>=0;if (res<0) return 0;if (!f && dp[pos][res]!=-1) return dp[pos][res];int u;if (f) u=num[pos];else u=9;int ans=0;for (int i=0; i<=u; i++){ans+=dfs(pos-1,res-i*(1<<pos),f&&(i==u));}if (!f) dp[pos][res]=ans;return ans;}int calc(int x){int len=0;for (len=0; x; len++)num[len]=x%10,x/=10;int up=f(A);return dfs(len-1,up,true);}int main(){//freopen("in.txt","r",stdin);int tt;scanf("%d",&tt);int cnt=0;memset(dp,-1,sizeof dp);while(tt--){scanf("%d%d",&A,&B);int ans=calc(B);printf("Case #%d: %d\n",++cnt,ans);}return 0;}


0 0
原创粉丝点击