Hdu 4734 【数位DP】.cpp
题意:
我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字。
题目给出a,b,求出0~b有多少个不大于f(a)的数。
思路:
数位DP,用来学习数位DP了。
<数位DP>
所谓数位DP就是基于考虑数字的每一位来转移的DP。
例如求比456小的数,可以这么考虑,
4 5 6
4 5 (0~6)
4 (0~4) (0~9)
(0~3)(0~9) (0~9)
然后我们就可以考虑用dp[len][pre]表示长度为len,以pre开头的符合条件的数的个数。
这样就可以得到转移方程了。
而对于这道题,我们可以用dp[len][pre]表示长度为len且权值不大于pre的数。
这道题用记忆化搜索,除边界条件外记录dp[len][pre]的值,下一次发现以前已经计算过了就可以直接return;
初值:dp[len][pre] = 0;
dfs(len, pre, flag)表示求长度为len,不超过pre的所有符合条件的值。其中flag是用来控制边界的。
dfs过程中当深搜的边界,发现len < 0,pre >=0 的时候就返回1.
Tips:
下面记忆的时候要记得判断是不是边界,如果是边界算出来的答案是不完整的。
Code:
/******************************************
*Author: Griselda
*Created Time: 2013-11-17 18:38
*Filename: 4734.cpp
* ****************************************/
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std; int dp[][], mx[];
int dfs(int len, int pre, bool flag)
{
if (len < ) return pre >= ;
if (pre < ) return ;
if (!flag && dp[len][pre] != -) return dp[len][pre];
int end = flag?mx[len]:, ans = ;
for (int i = ; i <= end; ++i) {
ans += dfs(len-, pre-i*(<<len), flag&&i==end);
}
if (!flag) dp[len][pre] = ans;
return ans;
} int f(int x)
{
int tmp = , ans = ;
while (x) {
ans += x%*tmp;
x /= ;
tmp *= ;
}
return ans;
} int cal(int a, int b)
{
int top = ;
while (b) {
mx[top++] = b%;
b /= ;
}
return dfs(top-, f(a), true);
} int main()
{
int iCase = , nCase;
int a, b;
scanf("%d", &nCase);
memset(dp, 0xff, sizeof(dp));
while (nCase--) {
scanf("%d %d", &a, &b);
printf("Case #%d: %d\n", iCase++, cal(a, b));
}
return ;
}
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734
Hdu 4734 【数位DP】.cpp的更多相关文章
- [hdu 4734]数位dp例题
通过这个题目更加深入了解到了数位dp在记忆化搜索的过程中就是实现了没有限制条件的n位数的状态复用. #include<bits/stdc++.h> using namespace std; ...
- hdu 4734 数位dp
给一个数A (十进制表示形式为AnAn-1An-2 ... A2A1,定义函数 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,给一个B, ...
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6156 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6156 题意:如题. 解法:数位DP,暴力枚举进制之后,就转化成了求L,R区间的回文数的个数,这个直接做 ...
- hdu 3652数位dp
/* 数位dp 题意:找到1-n之间包括13这个子串而且可以整除13的数 解:刚開始dp[N][N][2]这里的2用来记录是否为13表示当前位是否为13,我把上一位为1当前位为13和上一位部位1 这样 ...
- hdu:2089 ( 数位dp入门+模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...
- HDU 4352 XHXJ's LIS HDU(数位DP)
HDU 4352 XHXJ's LIS HDU 题目大意 给你L到R区间,和一个数字K,然后让你求L到R区间之内满足最长上升子序列长度为K的数字有多少个 solution 简洁明了的题意总是让人无从下 ...
- hdu 3709 数位dp
数位dp,有了进一步的了解,模板也可以优化一下了 题意:找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数例如4139,以3为支点4*2 ...
- HDU 2089 数位dp入门
开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdi ...
随机推荐
- MSSQL - 根据时间倒序删除第一行数据
delete top(1) from Tb_PaintOut where PaintNumber = (select top (1) PaintNumber from Tb_PaintOut orde ...
- HTTP协议--简析
HTTP--超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,是所有的www文件都必须遵守的标准. 要想成为优秀的web开发人员,必须熟悉H ...
- JAVA 操作 DBF 文件数据库
1.依赖夹包 javadbf-[].4.1.jar jconn3.jar 2.添加属性文件 jdbc.properties jdbc.driverClassName=com.sybase.jdbc3. ...
- Swift - 内存泄露原因(循环强引用)及解决办法
Swift使用自动引用计数(ARC)来管理应用程序的内存使用.在大多是情况下,并不需要考虑内存的管理.当实例不再需要的时候,ARC会自动释放这些实例所使用的内存. 但ARC并不是绝对安全的.下面两种情 ...
- 国际化之MessageFormat与占位符
如果一个字符串文本中包含了多个与国际化相关的数据,可以使用MessageFormat类对这些数据进行批量处理. 例如: 在2016年1月9日的时候,一场台风导致了500间房屋的摧毁和¥1000000元 ...
- Android 通过wifi调试程序【转】
1.首先让android手机监听指定的端口: 这一步需要使用shell,因此手机上要有终端模拟器,不过网上很多,随便找个就行了,依次敲入下列几行: ? su//获取root权限 setprop ser ...
- 基于visual Studio2013解决面试题之0405和最大的子矩阵
题目
- Java中ArrayList和LinkedList差别
一般大家都知道ArrayList和LinkedList的大致差别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机訪问get和set.A ...
- Maven项目下 java.lang.ClassNotFoundException 常规解决的方法
网上非常多要改动.class .project的比較麻烦有时候还不一定管用.以下的方法适合于项目用已经引用了jar.可是执行时却ClassNotFound,请用例如以下方法试试: 严重: Error ...
- alv 显示 汇总数据
alv中有 字段设置 gs_fieldcat-do_sum = ‘1’.字段 用于控制汇总