
ACM-数位dp
Nicetomeetu-
没有
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
SPOJ - BALNUM Balanced Numbers 数位dp+状态压缩
1、状态压缩,用一个10位的3进制数字来表示0~9的状态,0表示未出现过,1表示出现奇数次,2表示出现偶数次。2、输出时不要用I64d。#include #include #include #include #include #include #include using namespace std;typedef long long int LL;LL dp[20]原创 2017-07-05 18:48:41 · 460 阅读 · 0 评论 -
HDU 3652 B-number 数位dp
和HDU 2089 不要62 初探数位dp这道题思路类似,先将dp数组预处理,再利用dp数组的结果计算[0, n)区间符合条件的数字的个数。定义状态dp[i][j][k][l]表示以j开头的i位数字中模13余l的数字个数,k = 0表示这些数字不包含13, k = 0表示包含13。然后按照相同的思路计算[0, n)内满足条件的数字个数,只不过要维护一个状态变量flag,flag =原创 2017-06-03 11:27:06 · 480 阅读 · 0 评论 -
URAL 1057 Amount of Degrees 数位dp
原题链接:URAL 1057 Amount of Degrees做了前两道数位dp,作者就在想:“数位dp原来这么简单啊,连状态都是一个模式,都是dp[i][j]表示以j开头的i位数字,看来再刷一道题就可以完全学会数位dp了。”可是这道题目现场打脸,orz,一点思路都没有,用前两道类似的状态根本无法解决此题。直到看了大神的论文才知道数位dp的水原来这么深(可能只是本渣觉得深),以后还是老老原创 2017-06-03 17:12:31 · 755 阅读 · 0 评论 -
异或求和式 数位dp
异或求和式给定长度为n的序列A[i],求所有A[i]xor A[j] (i输入第一行一个整数N接下来N行,第i行为A[i]输出所需的值样例输入3735样例输出12样例解释7 xor 3+3 xor 5+7 xor 5 = 4+6+2 = 12 先把原创 2017-06-03 18:57:45 · 2613 阅读 · 0 评论 -
HDU 4507 吉哥系列故事——恨7不成妻 数位dp
题目链接:吉哥系列故事——恨7不成妻。此题和HDU 3652 B-number这道题很相似,如果题解看不懂,可以先看3652这道题。代码如下:#include #include #include #include #include #define mod1 (m+7-(j*(bit[i]%7))%7)%7#define mod2 (n+7-j%7)%7using原创 2017-06-04 18:52:05 · 416 阅读 · 0 评论 -
HDU 4734 F(x) 数位dp
定义状态dp[i][j][m]表示以j开头的i位十进制数字中,函数值小于等于m的数字的个数。有如下状态转移方程代码如下:#include #include #include #include #include using namespace std;int A, B, bit[15];int dp[15][15][5005];int digit[15], l原创 2017-06-09 18:20:36 · 419 阅读 · 0 评论 -
HDU 3555 Bomb 数位dp
类似这道题目:HDU 2089 不要62讲解就略过了,和上面那题完全一样。#include #include #include #include #include using namespace std;typedef long long int LL;LL dp[65][10];void init(){ for (int i = 0; i <= 9; i+原创 2017-06-30 18:56:41 · 453 阅读 · 0 评论 -
CodeForces - 55D Beautiful numbers 数位dp+离散化
题目链接:Beautiful numbers很容易想到定义状态为dp[pos][sum][lcm]原创 2017-07-04 13:15:55 · 529 阅读 · 0 评论 -
POJ - 3252 Round Numbers 数位dp
定义状态dp[pos][zero][one],pos为当前数位,zero为前缀中0的个数,one为前缀中1的个数。注意前导0!假如要计算小于等于12的Round Number个数,12的长度为4,在dfs到3的时候,路径上的数字依次为0011,0的个数大于1的个数,所以3是符合条件的。真的对吗?实际上前两个0都是前导0,去掉前导0之后,就发现3其实是不合法的了。所以dfs的时候,维护一原创 2017-07-04 15:04:58 · 652 阅读 · 0 评论 -
HDU - 3709 Balanced Number 数位dp
题目链接:Balanced Number枚举中心轴,然后dfs即可。很容易就想到定义状态为dp[pos][pivot][left][right],pos为当前数位,pivot为中心轴,left为中心轴左边的权值和,right为中心轴右边的权值和。临界条件判断left是否等于right。我们知道左右两边的权值和最大值大约是1500,这样一来空间复杂度就变成了18 * 18 * 1500原创 2017-07-04 23:06:33 · 342 阅读 · 0 评论 -
HDU - 4352 XHXJ's LIS 数位dp+离散化
题目链接:XHXJ's LIS初看这道题目首先回忆起LIS的O(nlogn)的做法,于是想到定义状态dp[pos][LIS*][k],pos代表当前数位,LIS*代表由前缀构造的LIS数组,k代表最长上升子序列的长度。问题来了,一个数组肯定不能作为下标,所以我们要把这个数组转化成数字。注意到数组的每个元素取值范围都是0~9,数组的长度最大为10,所以一个最简单的想法就是把数组转化成一个原创 2017-07-05 17:19:21 · 501 阅读 · 0 评论 -
HDU 2089 不要62 初探数位dp
第一次写传说中的数位dp,久仰大名终于得见真容,无比激动!数位dp就是求在给定的区间[l, r]内满足条件C的数字的个数,这类区间统计问题往往可以用数学上的递推来描述,也就是dp了。关于这道题,定义状态dp[i][j]表示以数字j开头的i位数字中不含62和4的个数。什么意思呢?dp[2][6]就表示以数字6开头的两位数字中不包含62和4的个数。也就是61,63,65,66,67,68,69原创 2017-05-27 19:31:53 · 680 阅读 · 0 评论