博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解——HDU 4734 F(x) (数位DP)
阅读量:6419 次
发布时间:2019-06-23

本文共 1357 字,大约阅读时间需要 4 分钟。

这道题还是关于数位DP的板子题

数位DP有一个显著的特征,就是求的东西大概率与输入关系不大,理论上一般都是数的构成规律

然后这题就是算一个\( F(A) \)的公式值,然后求\( \left [ 0 ,  B \right ] \)区间内\( F(x) \)不大于\( F(A) \)的数的个数

所以由数据范围很容易得到计算出最大值不会超过4600

然后我们设状态\( dp[10][4600][4600] \)表示不同\( F(A) \)取值下的第\( pos \)个位置的值总和为 \( sumx \)的 数的个数

显然会MLE

这时候可以用减法转换状态

用\( dp[10][4600] \)表示到了第\( pos \)个位置,还要凑\( sumx \)的值的数的个数

然后就可以发现一个现象,这个状态与\( F(A) \)无关的

然后就可做了

注意一个事情,就是求的是不大于\( F(A) \)的数的个数

所以最后\( sumx \ge 0 \)就是合法状态了

#include 
#include
#include
using namespace std;int dp[10][4600],a[10];int dfs(int pos,int limit,int state){ if(state<0) return 0; if(pos==-1){ return state>=0; } if(!limit&&dp[pos][state]!=-1) return dp[pos][state]; int mid=0,up=limit?a[pos]:9; for(int i=0;i<=up;i++){ if((i<<(pos))<=state) mid+=dfs(pos-1,limit&&i==a[pos],state-(i<<(pos))); } if(!limit) dp[pos][state]=mid; return mid;}int solve(int A,int x){ int fa=0,cona=0; while(A){ fa+=((A%10)<<(cona)); A/=10; cona++; } int con=0; memset(a,0,sizeof(a)); while(x){ a[con]=x%10; x/=10; con++; } return dfs(con-1,true,fa);}int main(){ int T; memset(dp,-1,sizeof(dp) ); scanf("%d",&T); for(int i=1;i<=T;i++){ int A,B; scanf("%d %d",&A,&B); printf("Case #%d: %d\n",i,solve(A,B)); } return 0;}

 

转载于:https://www.cnblogs.com/dreagonm/p/9584647.html

你可能感兴趣的文章
Vue 折腾记 - (8) 写一个挺靠谱的多地区选择组件
查看>>
VS Code折腾记 - (3) 多图解VSCode基础功能
查看>>
再不懂区块链,你就OUT了!
查看>>
教你玩转自定义View—手撸一个倒计时控件如此简单
查看>>
『翻译』Node.js 调试
查看>>
我的iOS开发之路总结(更新啦~)
查看>>
Java NIO之拥抱Path和Files
查看>>
微信原图泄露的只能是 Exif ,你的隐私不在这!!!
查看>>
微信小程序教学第三章(含视频):小程序中级实战教程:列表篇-页面逻辑处理...
查看>>
页面间通信与数据共享解决方案简析
查看>>
Swift 中 Substrings 与 String
查看>>
作为一个开源软件的作者是一种什么样的感受?
查看>>
移动端适配知识你到底知多少
查看>>
Java基础笔记16
查看>>
TiDB 在 G7 的实践和未来
查看>>
重新认识javascript对象(三)——原型及原型链
查看>>
小学生学“数学”
查看>>
【Vue】组件使用之参数校验
查看>>
FastDFS蛋疼的集群和负载均衡(十七)之解决LVS+Keepalived遇到的问题
查看>>
深入剖析Redis系列(二) - Redis哨兵模式与高可用集群
查看>>