HDU 3652 B-number(数位dp&记忆化搜索)
来源:互联网 发布:查外文最全的数据库 编辑:程序博客网 时间:2024/06/13 19:01
题目链接:[kuangbin带你飞]专题十五 数位DP G - B-number
题意
求1~n的范围里含有13且能被13整除的数字的个数。
思路
首先,了解这样一个式子:a%m == ((b%m)*c+d)%m;
式子的正确是显然的,就不证明了。
那么判断数是否可以被13整除就可以分解为一位一位进行处理。
当然,我们也只需要储存取余后的值。
dfs(len, num, mod, flag)
mod记录数字对13取余后的值
len表示当前位数
num==0 不含13且上一位不为1
pre==1 不含13且上一位为1
pre==2 含13
flag表示是否可以任意取值(判断范围)。
如此,记忆化搜索即可得解。
代码
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cstdlib>#include <vector>using namespace std;#define LL long long#define MOD 13LL dp[20][3][13];int dis[20];LL dfs(int len, int type, int mod, bool flag){ if(len < 0) return type == 2 && mod == 0; if(!flag && dp[len][type][mod]!=-1) return dp[len][type][mod]; int end = flag?dis[len]:9; int ans = 0; for(int i=0; i<=end; i++) { if(type == 2 || (type == 1 && i == 3)) ans += dfs(len-1, 2, (mod*10+i)%MOD, flag&&i==end); else ans += dfs(len-1, i==1?1:0, (mod*10+i)%MOD, flag&&i==end); } if(!flag) dp[len][type][mod] = ans; return ans;}LL solve(LL n){ int len = 0; while(n) { dis[len++] = n%10; n /= 10; } return dfs(len-1, 0, 0, 1);}int main(){ int n; memset(dp, -1, sizeof(dp)); while(cin>>n) cout<<solve(n)<<endl; return 0;}
1 0
- HDU 3652 B-number(数位DP+记忆化搜索)
- HDU 3652 B-number(数位dp&记忆化搜索)
- HDU-3652 B-number(数位DP+记忆化搜索)
- HDU 3652 B-number 数位dp+记忆化搜索
- hdu 3652 B-number (数位dp+记忆化)
- B-number(数位DP+DFS记忆化搜索)
- hdu3709Balanced Number【数位dp记忆化搜索】
- hdu_3562_B-number(记忆化搜索|数位DP)
- hdu 5179 数位dp+记忆化搜索
- hdu 5898 数位dp,记忆化搜索
- HDU 3709 ZJU 3416 Balanced Number 数位dp 记忆搜索
- hdu 3652(数位dp 记忆化搜索方法)
- HDU 3652 记忆化搜索加 多维数位dp 模板
- HDU 3652--B-number(数位dp)
- HDU 3652 B-number(数位DP)
- [HDU 3652]B-number[数位DP]
- hdu 3652 B-number (数位DP)
- hdu 3652 B-number(数位DP)
- Singleton的最佳方法
- eclipse 创建 maven web 项目
- erlang学习文档
- linux sort
- Hibernate 执行原生SQL
- HDU 3652 B-number(数位dp&记忆化搜索)
- Scalaz(27)- Inference & Unapply :类型的推导和匹配
- hdoj 2091 空心三角形
- 在ParaView中增加实现MPR/MIP功能的filter
- Xcode 安装颜色插件 以及错误解决方法
- PHP 网络编程技术与实例
- 如何带好团队
- 设计模式(5)--策略模式
- view引用其他的表或者view被更改时, 怎么刷新view的metadata