HDU4734 F(x) 数位DP
http://acm.hdu.edu.cn/showproblem.php?pid=4734
算法:数位DP
dp[pos][V]意味着当第pos位确定时,权值小于V的数有几个。
稍微计算一下,最高位得权值也不到1000,所以我把V的大小定义为了10000。
#include<bits/stdc++.h> using namespace std; int dp[25][10000];//dp[pos][Value] vector<int>shu; int getV(int x){ int ans=0,t=1; while(x){ ans+=x%10*t; x/=10; t*=2; } return ans; } int dfs(int pos,int V,int sp){ if(V<0) return 0; if(pos==-1) return 1; if(!sp&&dp[pos][V]!=-1) return dp[pos][V]; int ans=0; int maxn=sp?shu[pos]:9; for(int i=0;i<=maxn;i++){ ans+=dfs(pos-1,V-i*(1<<pos),sp&&i==maxn); } if(!sp) dp[pos][V]=ans; return ans; } int cal(int a,int b){ int aV=getV(a); shu.clear(); while(b){ shu.push_back(b%10); b/=10; } return dfs(shu.size()-1,aV,1); } int main(){ memset(dp,-1,sizeof(dp)); int t,a,b;cin>>t; for(int Case=1;Case<=t;Case++){ scanf("%d%d",&a,&b); printf("Case #%d: %d\n",Case,cal(a,b)); } }