动态规划—数位dp
文章平均质量分 70
My_ACM_Dream
生活没有彩排每天都是现场直播
展开
-
hdu4352(数位dp+状态压缩)
题意:给出L和R找出在[L,R]中满足最长递增子序列长度等于K的个数。题解:状压想不到,看了kuangbin的才明白,1#include#include#include#include#includeusing namespace std;typedef long long lld;#define oo 0x3f3f3f3f#define mod 100000000原创 2014-12-12 01:48:27 · 2222 阅读 · 0 评论 -
URAL 1036 Lucky Tickets (高精度,数位dp)
题意:求2*N位的数,前N位数和等于后N位数和并且这个和等于S对应的数的个数。题解:高精度存dp,dp[i][j]表示前i位和为j的个数,状态转移很容易。注意和为奇数时无解所以结果是0.#include#include#include#include#include#include#include#include#includeusing namespace st原创 2015-03-25 01:43:39 · 737 阅读 · 0 评论 -
hdu 5179 beautiful number (数位dp)
一道很水的数位dp,不说了直接上转台 dp[pos][pre] 第i位,前一为数位pre,对应的个数。#include#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef __int64 ll;typ原创 2015-02-28 22:38:49 · 868 阅读 · 0 评论 -
URAL 1057 Amount of Degrees (数位dp)
题意:给出一个范围,求范围内,等于K个B^x的个数,其中x任意。题解:这样的式子B^a+B^b+...B^0,很想容易想到进制的转化,我们将某个数R转化为B进制,发现题目所求的个数就是求这个R转化成的B进制的数范围内满足只有0和1,并且1的个数为K个对应的数的个数。然后身下来就是用dp统计出现次数,剩下的就是陋题了。#include#include#include#inc原创 2015-03-15 19:43:22 · 423 阅读 · 0 评论 -
spoj 1182 Sorted bit squence (数位dp)
题意:给出一个范围,这个范围的数换算成二进制,然后根据1的数目排序从少到多,如果1的数量相同就根据数字的大小排序,大的在后面。求第k大的数。题解:数位的统计问题,首先预处理dp[i][j]位数i,1的个数j的数的个数。然后根据区间我们枚举1的个数,计算区间1的个数为i的数的个数,不断累加直到超过k,那么k中1的个数肯定是等于枚举的最后一个i。那么在去区间二分答案。#include原创 2015-03-16 14:08:10 · 442 阅读 · 0 评论 -
SGU 390 Tickets (数位dp,k进制树的合并)
题意:给出一个区间,将这个区间连续的数的数位加起来,保证和要不小于k,求能分的最多区间。题解:详细可以看算法合集之《浅谈数位类统计问题》,这题我们将数变成一个k进制的树,然后在树上考虑问题,对于这样的区间和,相当于树上子树的合并问题,因为合并会出现上个子树还有剩余的数位和,于是我们要合理利用这些数位和,dp[pos][sum][rem]表示数位pos,和为sum,前一棵子树还剩余rem原创 2015-03-16 21:18:29 · 1177 阅读 · 0 评论 -
hihoCoder 1076 与链 (数位dp)
题意:给定 n 和 k。计算有多少长度为 k 的数组 a1, a2, ..., ak,(0≤ai) 满足:a1 + a2 + ... + ak = n。对于任意的 i = 0, ..., k - 1 有 ai AND ai + 1 = ai + 1。其中AND是与操作.题解:分析ai&ai+1=ai+1这个操作,我们会发现,ai+1必须比ai小或者等于ai才能满足,并且将其化成二进原创 2015-03-30 13:42:57 · 1159 阅读 · 0 评论 -
poj 3208 Apocalypse Someday (数位dp+二分答案)
题意:求第n个含有666的数。题解:第一反应就是数位dp然后二分答案,手残代码没写好wa好多次。正解是自动机dp,感觉大才小用了。我用记忆化写的,二分答案,但是有时候无法得到精确解,因此对结果进行稍微的波动处理下。#include#include#include#include#include#include#include#include#includeusin原创 2015-04-02 00:29:24 · 604 阅读 · 0 评论 -
poj 3971 Scales (数位dp,好题)
题意:给出一个二进制形式的重量的物品,现在有n个砝码分别是2^0、2^1....2^(n-1)。现在问如何在天平上放砝码可以使得天平平衡。题解:我们分析,假设我们左边放的砝码重量总和为x,右边放的重量总和为y(左边还有放物品)。那么问题就转化重量为w的物品加砝码能变成那些可行重量的问题。我们根据物品的重量的二进制来求解,按位dp。dp[i][2],0表示进位,1表示不进位。这样分两原创 2015-04-02 21:10:51 · 777 阅读 · 0 评论 -
sdut 2609 A-Number and B-Number (数位dp,二分答案)
题意:求第n个Bnumber。题解:我们可以二分枚举答案,判断是否满足条件,通过二分不断往正确解缩进。那么问题就变成求n以内的数包含了多少Bnumber,这个很明显是用数位dp求解,先求出Anumber的个数,然后减去不满足的数就是Bnumber的个数,处理有一点小技巧。#include#include#include#include#include#include#i原创 2015-04-07 00:11:01 · 726 阅读 · 0 评论 -
acdream 1064 完美数 (数位dp)
题意:求出区间中要么含3要么含8的数的个数。题解:直接搞设dp[pos][ha][hb][num],num=0表示含3,num=1表示含8,ha表示是否包含num,hb则相反。#include#include#include#include#include#include#include#include#include#define B(x) (1<<(x))u原创 2015-04-30 19:08:09 · 618 阅读 · 0 评论 -
codeforces 54C First Digit Law (数位dp+概率dp+背包模型)
题意:给出n个区间,然后每个区间中取任何数的概率都是1/(r-l+1),现在问n个区间任意的组成的任意集合,求某个集合满足里面的数首位是1的个数大于k的概率。题解:说起来很绕,读了一个小时也没读懂啊!不看题解的翻译根本读不懂题目啊!我严重怀疑出题人的英语水平。不过是一道好题,首先要得到区间中首位为1的数字个数要数位dp或者组合数学,然后就是背包模型的概率dp,因为要求任意字集合满足原创 2015-02-11 14:34:43 · 900 阅读 · 0 评论 -
hdu 5208 Where is Bob (数位dp,k进制树合并)
题意:Alice和一个人玩游戏(艹Bob没了),假设另外一个是Bob吧!他们各自从区间A和区间B中取一个数,然后两个数做异或运算,现在Alice想让整个数尽量打,Bob想让这个数尽量小。问最后的数是多少。题解:这题首先要懂这个博弈,表示真心没懂这个博弈,听了凡神指点,虐有明白。如果知道了这个博弈就能做这题了。我们设置dp[pos][f1][f2][f3][f4]表示在某个位pos并且边原创 2015-04-18 22:25:39 · 846 阅读 · 0 评论 -
codeforces 509C Sums of Digits (贪心对位操作)
题意:给出n个数字,这些数字数由另外n个数字各个位数的和得来的。求另外n个数,要尽量小,而且要递增。题解:贪心,对位进行操作,有点像数位dp。#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int o原创 2015-02-16 21:37:44 · 662 阅读 · 0 评论 -
Codeforces 55D Beautiful numbers (数位dp,状压辅助)
题意:各处一个范围[L,R] 问这个范围内满足这样条件的数的个数:这个数能整出其各个位上的数。题解:表示不会做,看了题解才懂,又是状压,我也是醉了,不过单单是状压还不够,这里要用到余数,就是这个数mod(1-9)的最小公约数,这样通过状态和余数就唯一确定了一个状态于是就可以很愉快的记忆搜索。这里有一个省内存点的地方,因为只要数中出现1和0都不影响结果,那么状压压缩只要8个数即可2-原创 2014-12-12 11:10:24 · 786 阅读 · 0 评论 -
fjnu2013校赛E(数位dp,排列组合)
题意:给出10个数字,分别表示数i有a[i]个,问这些数都要用上能构成被11整除的数的个数。题解:初始状态dp[i][j][x][y] 用前i个数,j位奇数位,奇数位和为x,偶数位和为y满足条件的个数。很明这个内存不允许,其实可以把偶数为的状态删掉,因为偶数为的个数可以用总位数-奇数位的,只要没次记录总位数。变成dp[i][j][x]但是还是太大,用滚动数组dp[2][j][x],然后原创 2015-02-19 15:05:57 · 521 阅读 · 0 评论 -
codeforces #247D Random Task (数位dp+二分搜索)
题意:给出m,k,找到这样的数n,满足n+1,n+2,n+3.....2*n区间内有m个数的二进制数中1的个数为k。题解:一开就想到枚举这样的数求在n+1,n+2,n+3.....2*n区间内有二进制有k个1的数的个数然后和m匹配如果相等就输出这个数,但是这样搜索O(n)很慢,会TL。看了大犇的,用二分,因为这样的m是随数增加而递增的。所以果断盗取了方法,二分下直接给过了1a。我用的是原创 2015-02-01 12:11:42 · 720 阅读 · 0 评论 -
codeforces 204A Little Elephant and Interval (数位dp)
题意:给出一个范围[L,R] 要求这个范围内满足第一位和最后一位相等的数的个数。题解:数位dp搞定,状态dp[pos][num]表示位数pos,第一位为num时满足条件个数。这里有一个处理头的技巧,就是通过前导零来判断第一位,不然会误判,一开始就误判了没出结果,改下1a。#include#include#include#include#include#include原创 2015-02-01 19:03:05 · 731 阅读 · 0 评论 -
hdu3555Bomb(记忆优化,数位dp)
题意:找出n范围内含有49的数的个数。题解:之前做过这题这次用记忆优化在做一边试了下,发现记忆优化好处很多,尤其是数位dp很容易实现。#include#include#include#include#includeusing namespace std;typedef long long lld;#define oo 0x3f3f3f3f#define mod 10原创 2014-12-12 00:00:59 · 519 阅读 · 0 评论 -
hdu4722(记忆优化,数位dp)
题意:计算在范围[a,b]内满足各个位数和能整除10的个数。题解:状态:dp[pos][sum] 位数为pos时和为sum满足条件的个数#include#include#include#include#includeusing namespace std;typedef __int64 lld;#define oo 0x3f3f3f3f#define digit 2原创 2014-12-13 13:24:34 · 465 阅读 · 0 评论 -
bnu1065(数位dp)
题意:#includeint main(){ int n,a[10001]; int T; int i,j,k; int ans=0; scanf("%d",&T); while(T--) { scanf("%d",&n); ans=0; for(i=0;i<n;++i) scanf(原创 2014-12-13 11:36:50 · 531 阅读 · 0 评论 -
FZU2042(数位dp)
好题!难题!题意:给出两个区间,现在任取区间的两个数(每个区间取一个),假设第一个区间取数i,第二个区间取数j,判断满足i^j>e的所有i^j的和,其中e是给定的数。题解:数位dp,设计这样的状态dp[i][j][k][t] 第i位时满足条件的个数,状态不好解释直解看代码。把所有的 位数弄成2进制的形式,因为2进制只有01在处理时有一些技巧,具体看代码。注意一个细节:如果位数的原创 2014-12-13 01:34:52 · 552 阅读 · 0 评论 -
FZU2109(数位dp)
题意:给出一个范围 [a,b] 问在这个范围内满足奇数位的数大于偶数位的数:定义这样的数x=a[0]a[1]a[2]a[3].....a[n] 那么一定要满足 a[2*i]题解;设定这样的状态dp[pos][pre][odd] 第pos位前一个数为pre这个数是奇数还是偶数对应的满足条件的个数!#include#include#include#include#inclu原创 2014-12-13 10:34:15 · 661 阅读 · 1 评论 -
hdu4389(记忆优化,数位dp)
题意:给定一个范围,求这个范围中满足以下条件的数的个数:这个数要满足这个数本身能整出这个数各个位上数的和。题解:状态很难想!!dp[pos][sum][mod][res] 前pos位和为sum模以mod结果为res的个数我用的记忆搜索,比递推好理解多了。枚举取模的数,搜索到深度底部是判断如果结果res=0&&sum==mod时返回1.#include#include原创 2014-12-13 16:32:46 · 819 阅读 · 0 评论 -
poj3252(记忆优化,数位dp)
题意:找出给定范围中满足这个条件的数的个数:这个数各个转化成2进制0个数大于1的个数。题解:设定状态:因为这题各个数位的关系只与0、1的个数有关,那么就可以这样dp[pos][one][zero]位数pos一的个数为one零的个数为zero满足条件数的个数。注意前导零的问题,所以在搜索时加了特别的判断!因为二进制只有0和1,前导零是不算在这个数中零的个数上面的。#include原创 2014-12-13 17:39:26 · 629 阅读 · 0 评论 -
poj2282(组合数学,数位上的dp)
题意:计算给定范围内0-9这些数出现的次数题解:组合数学方法即可算出,感觉dp太大材小用了。给出解法,都在代码注释里头。#include#include#include#include#includeusing namespace std;typedef __int64 lld;const lld MOD=1000000007;#define oo 0x3f3f原创 2014-12-14 13:42:42 · 1037 阅读 · 0 评论 -
hdu3652(记忆优化,数位dp)
题意:给出一个n,求出n范围内含有13并且能被13整除的个数题解:这题用递推很难做,直接记忆搜索很简单。发现记忆搜索真的很灵活很实用,想要什么状态就加什么状态,1a好感动!!状态:dp[pos][pre][is][sum] 位数为pos前一个数位pre是否含有13 is 和为sum的个数,sum每次都模13#include#include#include#include原创 2014-12-14 14:45:53 · 489 阅读 · 0 评论 -
HUNNU11409(数位dp)
题意:给出一个数字n,代表有多少位,现在要求n位的数字中满足从高位到低位成非递减的数的个数。题解:这题只要两个状态一个数位数(必须的),另一个状态是对应位数的数最后的位置的那个数即:dp[pos][num],如果用记忆搜索则另一个状态存前一个位的数是什么dp[pos][pre];两种方法:递推和递归,发现只有递推能过,递归会爆栈(目测这oj用的是window系统栈比较小,跟hdu一原创 2014-12-13 23:33:43 · 519 阅读 · 0 评论 -
poj3286(组合数学,数位dp)
题意:计算给定范围内的数中含有的0的个数。题解:组合数学这题和poj2282一样不过要特判0的情况,如果下限是从0开始要多加1,这个结论只能靠实践出来了。汗!#include#include#include#include#includeusing namespace std;typedef __int64 lld;const lld MOD=1000000007原创 2014-12-14 14:31:16 · 523 阅读 · 0 评论 -
BNU 11993 Soccer Teams (01背包变形+数位dp)
题意:给出9个数分别表示有a[i]数字i,现在这些数字都要用上,但是可以附加任何个0。问能被11整数的数的最小位数是多少。题解:01背包的变形有点像数位dp对位进行操作。dp[i][j]表示去了i位并且这些位上的和%11位j,dp[i][j]计算出的是奇数位上数的和为j的情况,之后枚举奇数位,得出偶数位,进行比较取得位数的最小值。#include#include#inc原创 2015-02-19 11:54:51 · 561 阅读 · 0 评论 -
zoj 3870 Team Formation (数位统计问题)
题意:给出n个数组成的序列,求满足这样的数对的个数,i!=j,a[i]^a[j]>max(a[i],a[j]);题解:这题可以从二进制的角度去观察,我们可以枚举数对中的某个数i,然后计算有多少个j满足。对于j个数的计算,通过2进制数位的分析会发现,只要小于a[i]并且最高为和a[i]的对应位是不同的数就满足条件。预处理出最高位数是1的个数,剩下就是暴力枚举i和a[i]的位。#inc原创 2015-04-28 22:44:53 · 536 阅读 · 0 评论