HDU(4734),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734
F(x)
Time Limit: 1000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4389 Accepted Submission(s): 1614
* 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 < 109)
0 100
1 10
5 100
Case #2: 2
Case #3: 13
int dfs(int i, int s, bool e) {
if(i==-) return s==target_s;
if(!e && ~f[i][s]) return f[i][s];
int res = ;
int u = e?num[i]:;
for(int d = first?:; d <= u; ++d)
res += dfs(i-, new_s(s, d), e&&d==u);
return e?res:f[i][s]=res;
}
// pos = 当前处理的位置(一般从高位到低位)
// pre = 上一个位的数字(更高的那一位)
// status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回,
// 给计数器+1。
// limit = 是否受限,也即当前处理这位能否随便取值。如567,当前处理6这位,
// 如果前面取的是4,则当前这位可以取0-9。如果前面取的5,那么当前
// 这位就不能随便取,不然会超出这个数的范围,所以如果前面取5的
// 话此时的limit=1,也就是说当前只可以取0-6。
//
// 用DP数组保存这三个状态是因为往后转移的时候会遇到很多重复的情况。
int dfs(int pos,int pre,int status,int limit)
{
//已结搜到尽头,返回"是否找到了答案"这个状态。
if(pos < )
return status; //DP里保存的是完整的,也即不受限的答案,所以如果满足的话,可以直接返回。
if(!limit && DP[pos][pre][status] != -)
return DP[pos][pre][status]; int end = limit ? DIG[pos] : ;
int ret = ; //往下搜的状态表示的很巧妙,status用||是因为如果前面找到了答案那么后面
//还有没有答案都无所谓了。而limti用&&是因为只有前面受限、当前受限才能
//推出下一步也受限,比如567,如果是46X的情况,虽然6已经到尽头,但是后面的
//个位仍然可以随便取,因为百位没受限,所以如果个位要受限,那么前面必须是56。
//
//这里用"不要49"一题来做例子。
for(int i = ;i <= end;i ++)
ret += dfs(pos - ,i,status || (pre == && i == ),limit && (i == end)); //DP里保存完整的、取到尽头的数据
if(!limit)
DP[pos][pre][status] = ret; return ret;
}
#include<cstdio>
#include<cstring>
#define maxn 16 int dp[maxn][];
int d[maxn];
int n;
long long tt; long long dfs(int len,int pre,bool fp)
{
if(pre<) return ;
if(!len) return ;
if(!fp&&dp[len][pre]!=-)return dp[len][pre];//记忆化搜索
int fpmax=fp?d[len]:;
int ret=;
for(int i=; i<=fpmax; i++)
{
ret+= dfs(len-,pre-i*(<<(len-)),fp&&i==fpmax);
}
if(!fp)dp[len][pre]=ret;//记录结果
return ret;
} long long calc(long long a)
{
int len=;
memset(d,,sizeof(d));
while(a)
{
d[++len]=a%;
a/=;
}
return dfs(len,tt,true);
} int get(int x)
{
int tmp=;
int ans=;
while(x)
{
ans+=(x%)*tmp;
x/=;
tmp<<=;
}
return ans;
} int main()
{
//freopen("input.txt","r",stdin);
long long a,b;
int nc;
scanf("%d",&nc);
int d=;
memset(dp,-,sizeof(dp));
while(nc--)
{
scanf("%I64d%I64d",&a,&b);
tt=get(a);
printf("Case #%d: %I64d\n",d++,calc(b));
}
return ;
}
HDU(4734),数位DP的更多相关文章
- [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: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 ...
- HDU 2089 数位dp/字符串处理 两种方法
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
随机推荐
- Adobe Flash CC 安装报错的解决办法
安装FlashCC的时候莫名的报错 ---------------------------Flash.exe - 应用程序错误---------------------------应用程序无法正常启动 ...
- MFC主窗口架构模型
根据主窗口类型,MFC软件工程可以分为一下几种架构模型: 1.SDI(Simple Document Interface)单文档界面,一个主窗口下只编辑一份文档 2.MDI(Multiple Docu ...
- springday04-go1
springmvc02:1.创建项目,导入jar包 2.复制xml文件到src下 3.在web.xml中配置DispatcherServlet(代码一致) <?xml version=" ...
- Mysql自定义函数总结
存储函数 创建存储函数,需要使用CREATE FUNCTION语句,基本语法如下: CREATE FUNCTION func_name([func_parameter]) RETURNS TYPE [ ...
- 去掉vim的高亮的方法
使用vim时经常因为误用了组合键而进行了搜索操作,搜索到的内容会被加上背景色,而且背景色一直保持着,就算下一次打开这个文件,还会显示搜索到内容的背景色 在vim中使用一个命令即可去掉: nohl
- zw版【转发·台湾nvp系列Delphi例程】HALCON DivImage2
zw版[转发·台湾nvp系列Delphi例程]HALCON DivImage2 procedure TForm1.Button1Click(Sender: TObject);var op : HOpe ...
- pic计数
#include <pic.h> //用的是PICC编译器 __CONFIG (HS & PROTECT & PWRTEN & BOREN & WDTDIS ...
- Yii多表关联
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name ...
- 【和小强学移动app测试2】移动终端app测试点归纳(持续更新)
以下所有测试最后必须在真机上完整的执行 1.安装.卸载测试 在真机上的以及通过91等第三方的安装与卸载 安装在手机上还是sd卡上 2.启动app测试 3.升级测试 数字签名.升级覆盖安装.下载后手 ...
- linux设备驱动归纳总结(八):1.总线、设备和驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-109733.html linux设备驱动归纳总结(八):1.总线.设备和驱动 xxxxxxxxxxxx ...