HDU4734 F(x)
来源:互联网 发布:stc单片机程序烧录 编辑:程序博客网 时间:2024/06/03 17:44
For a decimal number x with n digits (A nA n-1A n-2 ... A 2A 1), we define its weight as F(x) = A n * 2 n-1 + A n-1 * 2 n-2 + ... + A 2 * 2 + A 1 * 1. Now you are given two numbers A and B, please calculate how many numbers are there between 0 and B, inclusive, whose weight is no more than F(A).
For each test case, there are two numbers A and B (0 <= A,B < 10 9)
30 1001 105 100
Case #1: 1Case #2: 2Case #3: 13
人家说是入门级的,可我怎么想也没想出来,我知道优化的方向就是dp的初始化应该只有一次就好了,然而就是没想到转化一下思维。
一开始第二维表示的是当前数的价值的和,然后dp数组记忆化搜索的作用就显得不是那么大了。因为你存和跟你的A的价值的限制是有关系的,每次dp都初始化的话,作用就大打折扣了。
这时候就需要转化一下思维,第二维表示,价值不超过这个数的数的个数,这样,下一次相同的A出现的时候可以直接用。A变得时候不会影响到dp的状态的。
//#include <bits/stdc++.h>#include <cstdio>#include <cstring>using namespace std;typedef long long LL;int a,b;int dp[20][4600];int digit[20];int f(int x){ int sum = 0; int p = 1; while(x) { sum += (x%10)*p; x /= 10; p <<= 1; } return sum;}int dfs(int len,int sum,bool up){ if(sum < 0)return 0; if(len == -1)return sum >= 0; if(!up && dp[len][sum] != -1)return dp[len][sum]; int res = 0; int n = up?digit[len] : 9; for(int i = 0 ; i <= n ; ++i) { res += dfs(len - 1,sum - i*(1<<len),up && i==n); } if(!up)dp[len][sum] = res; return res;}int cal(int x){ int len = 0; while(x) { digit[len++] = x % 10; x /= 10; } return dfs(len - 1,f(a),1);}int main(){ int t; scanf("%d",&t); memset(dp,-1,sizeof dp); for(int tt = 1 ; tt <= t ; ++tt) { scanf("%d%d",&a,&b); printf("Case #%d: %d\n",tt,cal(b)); } return 0;}
阅读全文
0 0
- HDU4734 F(x)
- HDU4734[F(x)]
- HDU4734 F(x)
- hdu4734,F(x), 数位dp
- hdu4734 F(x) 数位dp
- HDU4734 F(x) 数位DP
- hdu4734---F(x)(数位dp)
- hdu4734 F(x) 数位dp
- HDU4734 F(x) 数位DP
- [数位DP] HDU4734 F(x)
- hdu4734 F(x) (数位dp)
- 【HDU4734】F(x) 数位DP
- HDU4734 F(x)[数位DP]
- HDU4734 F(x) 数位dp
- hdu4734 F(x) 数位dp
- F(x) (数位DP hdu4734)
- HDU4734--F(x) HDU(150)
- hdu4734 F(x)(数位dp)
- 二叉树的镜像
- IntelliJ IDEA:Unregistered VCS root detected. The directory…is under Git, but is not registered in t
- websphere mq java base classes
- 编译原理三大经典书籍(龙书 虎书 鲸书)
- 设计模式之装饰者模式
- HDU4734 F(x)
- scala(2)-----基础语法
- -----暴力dfs+回溯 hdu 1045-Fire Net
- SQL的四种连接-左外连接、右外连接、内连接、全连接
- POJ3093 浅谈背包DP预处理
- 判定字符串形式IP是否有效
- 替换空格
- [牛客网,剑指offer,python] 重建二叉树
- hadoop HA 详解