About exam161101——Nescafe Poetize I
- Summary:
每逢Nescafe必挂。DP还要再练。 - T1:
这题当时秒出算法也是超神。其实也好像挺好想的,观察一下样例就会发现每次连接两个已经在同一连通块的点,方案数就会2+1。细想,加入一条新边以后以前的方案都可以走这条边,再加上新的两个点形成的块正好是2方案数+1。而判断连通性我们通常使用并查集,拉进没有连通的点,已经连通的点再加边就更新答案。 - T2:
看到题目就被吓死,看了std又觉得自己傻,还是套路太浅。这题我认为最困难的是状态定义。有了状态定义DP方程就不难得出了。而涉及负数下标通过加偏移解决。另外,分析数据也很重要,背包容量超过n的时候就是没有意义的。所以不用担心数组开不下。(这种观察数据得出结论的情况又参见3022) - T3:
正解不懂。考场上写的毫无思考的模拟改一下输出删掉特判就可以得80分。加特判一定要分析数据范围,搞清楚自己程序的最大承受时间再特判,不要偷懒。
About 1373
- 二维偏序一般先sort一维,在另一维处理。 求“交叉数”使用树状数组(即求逆序对,参见3736),求“最多不交叉”使用LIS。
About 1907
- 定义实数常数时注意精度,多开一点无妨。
- 最开始定义的二维DP无法实现(坐标规模过大,空间时间都无法承受)则考虑另一种数据(本题中即为k,仅为1000)来简化状态。因为本题中没有经过特殊点的地方之间的距离为曼哈顿距离*100,所以我们需要关心的仅仅是特殊点之间的转移。
About 1977
- 与3022类似,都是求带系数不定方程解的个数。但是此题的方程却略有区别。此题求的是非负整数解的个数,与求正整数解个数的区别:(k为系数)
f[i][j]=f[i-1][j-0*k]+f[i-1][j-1*k]+f[i-1][j-2*k]+...//非负
//与正整数解个数的区别在于第一项中j-0*k。
f[i][j]=f[i-1][j-1*k]+f[i-1][j-2*k]+f[i-1][j-3*k]+...//正
//故非负解的个数递推方程应为:
f[i][j]=f[i-1][j]+f[i][j-k]
//正整数解:
f[i][j]=f[i-1][j-k]+f[i][j-k]
- 另外,如果是不带系数不定方程求解的个数则为组合数。非负整数解个数应为C(n+k-1,k),正整数解个数应为C(k-1,n-1)。