HDU-4734 F(x) (数位dp)

来源:互联网 发布:ehviewer网络错误2016 编辑:程序博客网 时间:2024/06/06 14:25

H - F(x)

 HDU - 4734 


题解:数位dp,考虑到T很大,不能每次都清空dp数组
一开始想错了,开了3维数组dp[i][tot][sum],表示当前数位是第i位,F(A)=tot,到当前数位为止的F(x)的值,结果超内存了。
发现只要改变一下就可以变成2维数组:把加法变成减法,dp[i][sum]中sum=F(A)-F(x),只要sum>=0就满足要求

#include<cstdio>#include<algorithm>#include<string.h>using namespace std;typedef long long LL;int len,a[15],dp[11][4610];int dfs(int i,int sum,int mark){    if(sum<0) return 0;    if(i==0) return sum>=0;    if(mark==0&&dp[i][sum]>=0) return dp[i][sum];    int mx=mark?a[i]:9;    int ret=0;    for(int j=0;j<=mx;j++){        ret+=dfs(i-1,sum-(1<<(i-1))*j,mark&&j==mx);    }    if(mark==0) dp[i][sum]=ret;    return ret;}int solve(int A,int x){    len=0;    while(x) {a[++len]=x%10;x/=10;}    int tot=0,tmp=1;    while(A){        tot+=tmp*(A%10);        tmp*=2;        A/=10;    }    return dfs(len,tot,1);}int main(){    int T,A,B;    scanf("%d",&T);    memset(dp,-1,sizeof(dp));    for(int cas=1;cas<=T;cas++){        scanf("%d%d",&A,&B);        printf("Case #%d: %d\n",cas,solve(A,B));    }    return 0;}


0 0
原创粉丝点击