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 ...
随机推荐
- PostgreSQL 中定义自己需要的数据类型
PostgreSQL解决某系数据库中的tinyint数据类型问题,创建自己需要的数据类型如下: CREATE DOMAIN tinyint AS smallint CONSTRAINT tinyint ...
- G面经prepare: Data Stream Average
给一个datastream和一个fixed window size, 让我design一个class可以完成add number还有find average in the window. 就是不能用v ...
- win7旗舰版梦幻主题补丁~完美你的桌面
随着VISTA和WIN7的逐渐普及,你是否想拥有一个与众不同的动态桌面呢~ Windows DreamScene属于Ultimate Extras的组件之一,而Ultimate Extras是专门为W ...
- HTML中调用servlet的问题(?)
最近在学习servlet.刚开始时,按照案例一行一行的敲代码.不过,出问题了. hello1.html <!DOCTYPE html> <html> <head> ...
- csuoj 1120: 病毒
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1120 1120: 病毒 Time Limit: 3 Sec Memory Limit: 128 ...
- [原创] 在spring 中使用quarts
1.使用maven加载 quarts 的jar <dependency> <groupId>org.quartz-scheduler</groupId> <a ...
- (转)【ASP.NET开发】获取客户端IP地址 via C#
[ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...
- 关于C# winform 快速制作不规则边框的方法
今天逛博客园突然发现一个帖子写的 快速建立不规则边框的方式 突然发现以前自己用API的方式好傻… 杀鸡焉用牛刀 下边是从网上不断转载的 原帖: 地址:http://www.cnblogs.com ...
- 夺命雷公狗---DEDECMS----20dedecms取出栏目页对应的内容
取出栏目页对应的内容 现在我们的栏目页面是可以完全正常跳转了,那么我们现在需要完成的就是让他的内容全部(电影,连续剧,综艺)分类的显示出来. 我们还是要使用{dede:arclist}标签来取出我们所 ...
- 夺命雷公狗---DEDECMS----13dedecms首页的完成
我们的dedecms搭建起来后直接复制templets的目录复制一份,如下所示: 然后进入templets目录里面,然后再将default里面的东西都给干掉,然后将我们预先准备好的首页放进来,代码如下 ...