hdu3709——数位dp+枚举
题目链接:https://vjudge.net/problem/HDU-3709
题目大意:求区间[l,r]里面满足平衡数的数的个数
平衡数定义:可以通过找一个平衡数位,该数位左边的数位乘以偏移距离的和等于右边的数位乘以偏移距离的和。
e.g:4139,平衡数位为3,4*2+1=9,因此该数是平衡数。
题解:
定义状态dp[pos][k][sum]表示枚举到pos位置,当前平衡数位位置为k,前面数位的数位乘以偏移距离的和。
最后判断一下是否等于0就行了。
我们可以枚举平衡数位的位置,同时在枚举时维护和就行了。
注意最后要减去重复的个数(即多枚举了num-1次0)
代码实现:
#pragma GCC optimize(2) #include <iostream> #include <algorithm> #include <cmath> #include <cstring> #include <cstdio> #include <cstdlib> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #define PI atan(1.0) * 4 #define E 2.718281828 #define rp(i, s, t) for (register int i = (s); i <= (t); i++) #define RP(i, t, s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a, b) memset(a, b, sizeof(a)) #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 #define pii pair<int, int> #define mp make_pair #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() {int a = 0, b = 1;char c = getchar();while (c < '0' || c > '9'){if (c == '-')b = -1;c = getchar();}while (c >= '0' && c <= '9'){a = (a << 3) + (a << 1) + c - '0';c = getchar();}return a * b; } int a[20],num; ll dp[20][20][10005]; ll dfs(int pos,int k,int sum,int lead,int limit){if(pos==0) return sum==0;if(sum<0) return 0;if(!lead&&!limit&&dp[pos][k][sum]!=-1) return dp[pos][k][sum];int up=limit?a[pos]:9;ll ans=0;rp(i,0,up){ans+=dfs(pos-1,k,sum+(pos-k)*i,lead&&i==0,limit&&i==a[pos]);}if(!limit&&!lead) return dp[pos][k][sum]=ans;return ans; } ll solve(ll x){if(x==-1) return 0;num=0;while(x) a[++num]=x%10,x/=10;ll ret=0;RP(i,num,1) ret+=dfs(num,i,0,1,1);return ret-num+1; } int main(){mst(dp,-1);int T=read();ll l,r;while(T--){scanf("%I64d%I64d",&l,&r);printf("%I64d\n",solve(r)-solve(l-1));}return 0; }
hdu3709——数位dp+枚举相关推荐
- 【数位DP】B-number(HDU 3652)
B-number HDU 3652 题目大意: 有一个数n,求出1~n中含'13'且能被13整除的数有多少个 输入样例 13 100 200 1000 输出样例 1 1 2 2 解题思路: 用数位DP ...
- 数位dp ---- 2020 icpc 上海 Sum of Log(枚举高位的二进制数位dp)
题目链接 题目大意 : 解题思路: 这里有个很核心的地方就是log2(i+j)\text{log2(i+j)}log2(i+j)本质上就是看看i+j\text{i+j}i+j的二进制高位在哪里? 那么 ...
- 动态规划 —— 数位 DP
[概述] 数位 DP 实际是一种计数用的 DP,一般就是统计一个区间 [le,ri] 内满足一些条件数的个数. 所求的限定条件往往与数的位数有关,例如:数位之和.指定数码个数.数的大小顺序分组等. 题 ...
- 数位DP 不断学习中。。。。
1, HDU 2089 不要62 :http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:不能出现4,或者相邻的62, dp[i][0],表示不存在不吉 ...
- 数位dp ---- 暴力 + 二进制的数位dp 2020济南 L Bit Sequence
题目链接 题目大意 f(x)=x的二进制中1的个数f(x)=x的二进制中1的个数f(x)=x的二进制中1的个数 给你一个数组[a1,a2,a3...,am]m∈[1,100][a_1,a_2,a_3. ...
- BZOJ 1799 [Ahoi2009] self 同类分布(数位DP)【BZOJ千题计划(quexin】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/1799(样例时限设置有问题,应该为 2 ...
- bzoj1799 数位dp
HYSBZ - 1799 题意:给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. 思路:数位dp,比较容易想到是数位dp,关键是dp式比较难想到,数位dp说到底是一个记忆化搜索的过程,d ...
- 数位dp 的简单入门
时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...
- 【hdu3555】Bomb 数位dp
题目描述 求 1~N 内包含数位串 "49" 的数的个数. 输入 The first line of input consists of an integer T (1 <= ...
- CF809C(找规律+数位DP)
老年选手需要多写一些思维题qwq. 通过打表很容易发现对于(i,j),值为(i-1)^(j-1)+1,然后本题就没了qwq. 矩阵差分还是很容易想到的,容斥成四个矩阵. 然后看到异或很容易想到三件事: ...
最新文章
- 为自己搭建一个鹊桥 -- Native Page与Web View之间的JSBridge实现方式
- VUE中让由全局变量添加生成的新数组不随全局变量的变化而变化
- WebSocket学习与使用
- mybatis14--注解的配置
- 201803-2碰撞的小球
- 05-按钮的基本使用-开发步骤
- 如何计算代码的运行性能
- PyQt5 QComboBox 样例代码
- Python numpy 多维数组切片
- 泥瓦匠 5 年 Java 的成长感悟(下)
- Mysql 获取昨日、今日、明日凌晨时间
- 每日一案:“实质性相似加接触”是判定作品侵权的核心标准---摘自“成都法院网”
- 2023南京理工大学计算机考研信息汇总
- 队列的图文介绍及C/C++的实现实例(转自http://www.cnblogs.com/skywang12345/p/3562279.html)
- OkHttp Events事件
- tp无线路由器设置打印服务器,打印服务器复位大全tplink路由器设置
- 常用视频质量评价库以及下载地址
- android 检测软键盘,Android:检测软键盘打开
- matlab seawater下载,海洋要素计算工具箱seawater
- 7.15、HTML5画布(矩形和圆形)