HDU4734(数位dp)】的更多相关文章

F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4423    Accepted Submission(s): 1632 Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F…
题意 先定义了一个函数F(X)=An*2^n-1+An-1*2^n-2+.....+A1*1.其中Ai为X的第i位的值.对于每组数据给出了两个整数A,B.问不超过B的数中有多少的F值是不超过F(A)的. 分析 经过计算我们发现,F(A)最大不会超过5000,于是我们可以把它加到记忆化里面.我们令dp[p][sum]为前p位数中不超过sum的数位多少.那么转移是很显然的 dp[p][sum]+=dp[p-1][sum-i*(1<<(p-1))] 但是到这里还不是重点!重点是这个题有一个必须要明白…
题目描述 对于一个非负整数 $x=​​\overline{a_na_{n-1}...a_2a_1}$ ,设 $F(x)=a_n·2^{n-1}+a_{n-1}·2^{n-2}+...+a_2·2^1+a_1·2^0=\sum\limits_{i=1}^na_i·2^{i-1}$ 多次询问 $[0,B]$ 区间内 $F$ 值小于等于 $F(A)$ 的数的个数. 输入 The first line has a number T (T <= 10000) , indicating the number…
(https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65608478) Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given…
题意:求0~f(b)中,有几个小于等于 f(a)的. 解题关键:数位dp #include<bits/stdc++.h> using namespace std; typedef long long ll; ; ][maxn],a[]; int get(int x){ ; while(x){ a[pos++]=x%; x/=; } return pos; } int f(int x){ ) ; )*+x%; } int dfs(int pos,int sta,bool limit){ ) ;…
题目传送门 F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8901    Accepted Submission(s): 3503 Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weigh…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 题目大意: 对于一个 \(n\) 位十进制数 \(x\) (\(A_nA_{n-1}A_{n-2} \cdots A_2A_1\)),我们定义 \[F(x)=A_n \times 2^{n-1} + A_{n-1} \times 2^{n-2} + \cdots + A_2 \times 2 + A_1 \times 1\] 现在给你两个数 \(A\) 和 \(B\) ,请计算出区间 \([0…
>传送门< 题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个. 思路:数位dp 就是数位上不能有4也不能有连续的62,没有4的话在枚举的时候判断一下,不枚举4就可以保证状态合法了,所以这个约束没有记忆化的必要,而对于62的话,涉及到两位,当前一位是6或者不是6这两种不同情况我计数是不相同的,所以要用状态来记录不同的方案数.dp[pos][sta]表示当前第pos位,前一位是否是6的状态,这里sta只需要去0和1两种状态就可以了,不是6的情况可视为同种,不会影响计数. Code…
>传送门<题意:对于一个有n位(这n位从高位到低位分别是An,An-1,An-2 ... A2,A1)的十进制数,我们定义它的权值F(x)=An*2n-1 + An-1*2n-2 + ... + A2*2 + A1*1.现在给你两个数A,B,请计算[0,B]范围内有多少个权值<=F(A)的数 思路:(这个下面文字是有点多,可能是我太弱了,在刚开始学的时候只有这样我才能理解QAQ~) 其实F(x)只是给每一个数位带上一个权值v = 2^(p-1),F(x)最大是值不会超过5000,我们完全…
(如此简短的题目给人一种莫名的压迫感......) 题目中定义一个数的权值求解函数:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. 观察可知:权值的表达式与数的位数相关,再加上要分离每个位上的数字,那么就不难想到数位DP了. dp[pos][j]表示pos位下小等于j的元素个数,代码如下: 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 c…