2018.4.7DP练习赛总结

2018.4.7DP练习赛总结
最近学的东西有点多,什么树状数组、线段数、trie树、kmp、dfs序、ac自动机,各种玄学操作疯狂输入,整得都没空搞DP。今天的练习赛,说实话心里还是有点慌的,不过还好,还算是过了4道题,虽然罚时罚出血。。。

A 免费馅饼 HDU1176
这道题一拿到直接想到FJ收苹果,然后发现数据10w,呵呵O(n^2)直接T飞。然后开始换思路,从阶段划分入手,不能用前i个馅饼来划分,那么就用前T秒。于是豁然开朗,DP[i][j]存储第j秒在位置i能接到的最多馅饼数。于是很显然的发现每个状态都只能由前一秒的左一格、右一格或本身转移得到。(因为速度为1)很水的一道题,然而由于一堆细节,像什么坐标为0时左一格的RE,罚时了好几次。。。

B 蛋糕CF 474D
这道题是相对水的一题了。与楼梯问题类似,我们把要吃的蛋糕数看做要走的楼梯级数,那么我们每次能走1级或k级,直接递推。十分顺利的AC了。

C 水果CF 366C
这题让我很头疼,刚拿到是由于后效性问题不知道怎么解决,连阶段都没法划分。于是开始转化问题,把b中每个数都乘上比值,那么就是取数使得Σai=Σk*bi,然而并不好处理,出于时间考虑,我放弃了这道题。然而,后来杨神讲解时只是把上述式子移了个项,就将问题转化为01背包(Σai-k*bi),太强了。%%%%%%

D 括号染色CF 149D
这题可以考虑用递归来将长串划分为小串,再一一合并的方法,然而还并没有写过。。。舒神,太强了。%%%%%%

E 回文串CF 245H
这题再2018福州寒假集训时有讲过,显然是个区间DP。枚举区间长度,对于区间DP[i][j],其DP值必定是由DP[i+1][j]、DP[i][j-1]、DP[i+1][j-1]推得的,在将DP[i+1][j]与DP[i][j-1]相加时,DP[i+1][j-1]中的回文串个数被加了两次,所以要将它减掉。(这里用了一个简单的容斥原理,由于DP[i+1][j-1]满足了两个条件(偶数个),所以将其减掉。即Σ(-1)^(k-1)*DP,k为满足条件数)于是这题就可以愉快的AC了,真是水啊。。。然而我在前几次提交时用了万恶的cout,于是T了好几次,又ji er 罚了两次时。

F 完美子串CF 432D
这题是KMP的套路题,只要理解了next数组的含义,就没什么了。
题意就是给你一个字符串,让你输出既是前缀又是后缀的子串个数,以及每个子串的长度即出现次数。首先出现次数简单,可以参考字符串最大值,这里不再多说。关键在于如何找到完美子串。首先,很显然最长的完美子串肯定是本身,只要理解了前后缀的含义就能很快得到;其次,除本身外的最长完美子串长度肯定是next[len]的值,这也很好理解;最后,也是最关键的一步,原串的完美子串,肯定是最长完美子串的完美子串。即:如果A是B的最长完美子串,C是A的最长完美子串,那么C也是B的完美子串。所以我们很容易想到对于原串的最长完美子串再做一次KMP求出一个新的next_[len’],一直下去。但事实上,我们发现没有必要多次求next,因为前缀和后缀是一样的,你想要求的next,与和原串的最长完美子串(除本身)相匹配的前缀的next是一样的。(比较绕)于是我们只要每次将你要查询的标记,跳至next[len]即可,直到0为止,也就是

f=next[len];
while(f>0){wanmeizichuan[++count].len=f;f=next[f];}

G 树的重心调整CF 709E
H 友好城市CF 700B
两道树形DP,比赛时直接放了,前面都来不及写。。。

最后,这次DP赛暴露了我的很多问题,最大的问题是细节上的,对于这种类似ACM的赛制,我吃了很大的亏,要么1,要么0,还有罚时,说实话成绩不是很好看,很多细节上的问题浪费了很多时间和精力。总之要更多地加强代码能力,对于细节上的东西平时要更多地去关注,一些小技巧也要熟知,还有,别再用cout了。。。

你可能感兴趣的:(新しいスタート)