动态规划_数位dp
TouchDreamer
这个作者很懒,什么都没留下…
展开
-
Code Forces 55 D. Beautiful numbers(数位DP)
题目分析 cf上的D题还是很有水准,出的题不难,一眼就能知道什么意思,也很容易想到一些东西,但是如果不多加一下处理,就不能成功的解决这道题。这道题真的是一道好题,感觉特别开动人的脑经。 首先我们要求Beautiful numbers,那么我们怎么求呢,肯定要求已经加进去的各位数字的最小公倍数了,只要最后处理到头得到的那个数能够整除这个数的所有位数的最小公倍数就可以,但是你以为这样就够了吗?原创 2016-07-22 12:25:16 · 285 阅读 · 0 评论 -
HDU 4507 吉哥系列故事――恨7不成妻(经典数位dp,好题)
题目分析 让你求与7无关的数的平方和,第一个条件不含7,那么我们在dfs进行深搜的时候遇到这种情况直接continue掉,关于第二个和第三个条件都很简单,只需要在状态中加2维,并且在状态转移中添加上即可。但是这些都不是重点,本题让你求与7无关的数的平方和,刚开始看到求得这个东西内心是崩溃的,但是你要想到数位dp是按位进行求解的,因此肯定是一位一位去求,并且将深度较大的节点的值传给深度较小的递归求原创 2016-10-14 15:39:06 · 476 阅读 · 0 评论 -
数位dp回顾以及自己一些的小想法
回顾 对于网络赛和多校联合集训时候出的数位dp的题目看了题解能很快A出来,但是自己写的时候就有很多问题,于是自己有重新看了以前做的一些题目,有了一些很好的想法,写这篇博客的目的一是总结经验,二是给跟我一样还在迷途中的人一些指导。 这里我就拿hdu3555Bomb为例说一下我自己的想法,对于数位dp我就用dfs的写法,这个写法简便且容易理解。对于数位dp我感觉最重要的就是定义状态转移方程,但原创 2016-10-14 13:44:21 · 288 阅读 · 0 评论 -
HDU 5898 odd-even number(2016 ACM/ICPC Asia Regional Shenyang Online)
题目分析 数位dp,记录下当前位置的奇数个数和偶数个数,遇到偶数,判断奇数是否合法,并且将奇数更新为0,同理遇到奇数也一样。注意前导0的判断。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long LL;LL dp[2原创 2016-09-26 16:28:44 · 345 阅读 · 0 评论 -
数位dp小结
数位dp如何入门 我最初在网上漫游了一天,终于找到了一个适合自己的学习方式,这里分享给大家。搜数位dp大部分都是记忆化搜索写的,因为这个搜索是反向的,所以一看是看上去真的什么都看不懂,因此我们首先学一下递推版的,这里给出网址,大家可以去看一下写的真的很好,认真看就能看明白初探数位dp,然后看懂了之后就手写代码,通常写hdu2089(不要62)这个入门题,这样我们就可以开始看记忆化搜索了,只是反向原创 2016-07-22 10:29:36 · 246 阅读 · 0 评论 -
HDU 5787 K-wolf Number
题目分析 多校的题目,状态比较好想,但是真的不好写,需要用一些比较巧妙的方法。这道题是数位dp,对于题目要求,我们需要定义的状态时,第一维表示当前处理的数的位数,后面的4维表示当前数字的前4位数,接下来表示当目前为止所有数字位上的数字是否满足K-wolf Number,最后一维肯定还是是否有限制了。对于这道题处理上的小技巧就是:1:当你处理前几位的时候,他们前面是没有数字的,因此我们将他们前面的原创 2016-08-04 13:05:52 · 485 阅读 · 0 评论 -
HDU 5456 Matches Puzzle Game(2015 ACM/ICPC Asia Regional Shenyang Online)
题目分析 之前也研究了一段时间的数位dp,但是一直没有见到这种形式的,状态看了好半天都不知道怎么找状态,看了别人的博客,也给看懂了,感觉其实也不是特别难,但是这种dp太不好查错了!!首先将式子化为A = B+C,那么我们需要定义状态,dp有4维,第一维很明显是火柴棍数量,第二维是有没有进位,第三位是B还能不能继续放数字,第四位是C还能不能继续放数字。状态转移方程见代码。#include <cs原创 2016-07-29 16:28:08 · 382 阅读 · 0 评论 -
SPOJ BALNUM - Balanced Numbers
题目分析 这道题的状态同样不好取,因为要求每一个奇数的个数都要为偶数,每一个偶数的位数都要为奇数,又因为只有10个数(0~9),又因为没个数只有3种状态,分别是没有(0),奇数个(1),偶数个(2),这样我们就利用3进制进行压缩就可以了,3的10次方不超过60000,因此直接开60000即可,这样dp[i][j]的i表示当前处理到了第i为,j表示当前(0~9)对应的状态。搞了3天这个了,现在感觉原创 2016-07-23 16:16:35 · 982 阅读 · 0 评论 -
hdu 4734 F(x)2013 ACM/ICPC Asia Regional Chengdu Online
题目分析 数位dp基础题,状态挺容易想到的,因为数字只有10位,2^9还不到才512,即使每一位都是9,运用等比数列求和知不超过5000,因此dp数组第一位表示位数,第二位就表示计算出来的f函数值,那么我们每一次就找小于F(A)的即可,同样要满足B的限制,这样就可以顺利写出状态转移方程了#include <cmath>#include <cstdio>#include <cstring>原创 2016-07-23 11:29:21 · 306 阅读 · 0 评论 -
HDU 3709 Balanced Number
题目分析 给定一个区间,看有多少数是跳板数,跳板树的定义是选定数字中的某一位作为支撑点,那么左边距支撑点的距离乘以左边数字的大小等于右边距支撑点的距离乘以右边数字的大小,如果相等,则为跳板数。这道题也是很迷呀!!写了半天一直在想我在里面找跳板,后来看了一下别人的博客瞬间明白了,我可以在最外面找跳板,简单并且清晰,可能写题写傻了!!!#include <cstdio>#include <cst原创 2016-07-22 20:43:10 · 225 阅读 · 0 评论 -
POJ 3252 Round Numbers
题目分析 找到2个给定的数之间二进制的表示中0比一大的个数。平时的数位dp用十进制进行分解,得到每一位的10进制数,这道题很明显按2进制进行分解就可以了,但是需要前导0要进行特别的判断,比如000101,前面的3个0很明显是不需要算进去的,在记忆化搜索是多加一个变量就可以了。#include <cstdio>#include <cstring>#include <iostream>#in原创 2016-07-22 20:37:30 · 336 阅读 · 0 评论 -
HDU 4352 XHXJ's LIS
题目分析 这道题前面说了一堆废话,不过这道题还是很有水准的,不愧是多校的题目。这道题就是让你求给定2个数字,让你求这2个数字之间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K。看这道题就满头包,不知道怎么构建状态,看了网上的代码,才发现原来要讲构成的递增子序列作为状态存下来,真是神奇呀!说好的数位dp,瞬间变成了数位dp加动规。然后就可以按照求单调递增子序列的n*logn的方法处理原创 2016-07-22 20:32:43 · 475 阅读 · 0 评论 -
2016弱校联盟十一专场10.5 I Increasing or Decreasing(数位dp)
题目分析 这道题就是给你2个数,让你求在这2个数之间单调不减或者单调不增的数的个数,定义状态dp[i][j][k],i表示数的第I位,j表示当前位的前一位数字的多少,k则表达三种意思,k等于0时表示这个序列目前是单调不减的,k等于1表示是单调不增的,k等于2表示目前并没有确定这个序列到底是的单调性,也是就说前几位数是相等的,或者前几位数全为0.这样就可以通过dfs写出状态转移方程,注意不合理的状原创 2016-10-26 20:52:34 · 366 阅读 · 0 评论