HDU 4734 F(x)
2016-05-07 10:43
387 查看
一个简单的数位dp
这题的时间卡的有点紧,因为T比较大
刚开始每组输入都重新计算dp数组,然后喜闻乐见的T了好久
重新设计状态让计算出来的dp数组和A无关,这样就可以多次利用了
这题的时间卡的有点紧,因为T比较大
刚开始每组输入都重新计算dp数组,然后喜闻乐见的T了好久
重新设计状态让计算出来的dp数组和A无关,这样就可以多次利用了
#include<bits/stdc++.h> using namespace std; #define LL long long const int maxn = 20; int tw[maxn],num[maxn]; int dp[maxn][200000]; int dfs(int pos,bool bnd,int lef){ if(pos < 0) return lef >= 0; if(lef < 0) return 0; int &ndp = dp[pos][lef]; if(!bnd && ndp != -1){ return ndp; } int ret = 0; int bound = bnd ? num[pos] : 9; for(int i=0;i<=bound;i++){ if(i * tw[pos] > lef) break; ret += dfs(pos-1,bnd && i==bound,lef - i*tw[pos]); } if(!bnd) ndp = ret; return ret; } int cw(int x){ int ret = 0,len = 0; while(x){ ret += tw[len]*(x%10); x /= 10; len++; } return ret; } int cal(int b,int a){ int len = 0; a = cw(a); while(b){ num[len++] = b % 10; b /= 10; } return dfs(len-1,true,a); } int main(){ tw[0] = 1; for(int i=1;i<maxn;i++){ tw[i] = tw[i-1]*2; } int icase = 1; int T; scanf("%d",&T); int b,a; memset(dp,-1,sizeof(dp)); while(T-- && ~scanf("%d %d",&a,&b)){ printf("Case #%d: %d\n",icase++,cal(b,a)); } return 0; }
相关文章推荐
- 在ASP.NET 2.0中操作数据之十九:给编辑和新增界面增加验证控件
- 获取statusbar的高度
- C++位运算
- 数据库密码过期,账号被锁解决方法
- debian下载、编译、使用Cimg的Demo
- hihoCoder 1301 筑地市场 数位dp加二分答案
- Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)
- 飛飛(三十一)指向学生的指针
- makefile中参数定义
- 集成C#测试框架和Selenium对于Web系统实现自动化测试
- Copy List with Random Pointer
- Grunt 自动编译 Less 文件配置
- C#中treeview的问题,如何区分根节点和子节点以及根节点和根节点的兄弟节点?
- 泛型
- js实现网页图片轮换播放
- 大数据实验室(大数据基础培训)——Zeppelin的安装、配置及基础使用
- Android自定义attr的各种坑
- 主机重启,redis无法启动(./redis-check-aof --fix <filename>)
- POJ 1979:Red and Black(dfs)
- MVVM编码指引