HDU - 4734(数位DP)
2017-08-11 23:22
344 查看
题解:用一维表示位数二维表示到达该位数差x多少然后就是数位DP模板加上记忆化搜索,转移方程下面看一下代码就明白了
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int dp[20][26000]; int bit[20]; int n,m,x; int dfs(int pos,int have,bool lim){ if(pos<=0) return have>=0; if(have<0) return 0; if(!lim&&dp[pos][have]!=-1) //如果不是上限并且已经搜个这种情况了就可以用这个后面所有的数直接返回 return dp[pos][have]; int num = lim?bit[pos]:9; int ans = 0; for(int i = 0; i <= num; i++) ans+=dfs(pos-1,have-i*(1<<(pos-1)),lim&&i==num); if(!lim) dp[pos][have] = ans; //不是上限这种情况就可以记忆化 return ans; } int calc(int n){ int len = 0; while(n){ bit[++len] = n%10; n /= 10; } return dfs(len,x,1); } int main(){ int t; scanf("%d",&t); memset(dp,-1,sizeof(dp)); for(int casei = 1; casei <= t; casei++){ scanf("%d%d",&n,&m); int k = 1; x = 0; while(n){ x += n%10*k; k*=2; n/=10; } //cout<<x<<endl; printf("Case #%d: %d\n",casei,calc(m)); } return 0; }
相关文章推荐
- hdu 4734 F(x) 数位dp
- hdu 4734 F(x) 数位dp
- HDU 4734 F(x) (数位DP,基础)
- hdu-4734-数位Dp
- 【数位DP】 HDU 4734 F(x)
- HDU-4734 F(x) 数位DP
- HDU 4734 F(x)(数位DP)
- HDU 4734 F(x) (数位dp)
- hdu 4734 数位dp
- HDU-4734 数位DP
- HDU 4734 F(x) (数位DP)
- hdu 4734 F(x) 数位dp
- 【数位dp】HDU - 4734 F(x)
- HDU 4734 F(X) 数位DP
- hdu 4734 数位DP
- hdu 4734 数位dp
- HDU 4734 F(x) 数位DP
- hdu4734——F(x) (数位DP)
- [HDU 4734]F(x)[数位DP]
- HDU 4734(数位dp)