总结
- 今天做题其实还是挺有感觉的。。但是思维没有开阔起来。
过程
- 先看了一下题目,第一题把他的式子随便化了一下,又看到A是01矩阵,就知道是道网络流裸题了。。第二题一开始想没有什么好的思路。第三题又是SAM的裸题。第四题看着那个条件感觉很眼熟,好像就是线性无关。刚好冬令营的时候讲过他的贪心。所以大致确定了1,3,4的做题顺序。
- 第一题还是比较好打的。但是一开始打了dinic,比较慢,后来换成了sap,打完差不多9点钟。
- 接下来打第三题,SAM还是不太熟悉。对fail指针的意义以及其Dp的顺序掌握不好。推了一下以为可以了。然后拍也是Ok的。
- 第四题,一开始都忘记高斯消元怎么打了。一直在改高斯消元。而且对于线性无关的判定很不熟悉。导致我根本无法把70分的算法改进到100分。而且拍完第四题之后都已经差不多10点半了。
- 最后去搞第二题。丝毫没有思路。自己YY了一个贪心。想不到怎么把题目模型抽象出来。
最后220。。第三题挂掉了。第二题只有十分。
第三题的错误在于,
- SAM Dp之前,应当把节点按其len进行排序,不能进行拓扑排序,因为fail的拓扑序不一定在其前面。
第二题的做法!!!
Description
给你一副 N∗M 的网格图。
上面的每个点都有宝藏数 Ai,Ai≥0
你每次都从左上角出发,并且只能往右边和下边走。
走到一个点,你只能捡起一个单位的宝藏。问你至少要走多少次,才能将所有的宝藏捡完。
N≤1000,M≤1000
我们可以注意到的是,
若对于两个位置 (i,j) , (x,y) ,满足 i≤x,j≥y ,那么我们永远都不可能用一条路径把他们两个都覆盖了。
我们找出宝藏总数最大的一个点对序列 (i1,j1),(i2,j2)......(ik,jk) ,其中 ix≤ix+1,jx≥jx+1
设其宝藏总数为 y
那么我们最终的答案就是 y这个为什么是正确的呢??
因为我们要覆盖这 k 个点,至少需要 k 条路径,且因为我们计出来的是宝藏总数最大的。也就是说约束最紧的点。
设最终的答案为 Ans
那么显然的是, Ans≥y
接下来我们证明 Ans≤y
设一个点 P(x,y) ,且P不在这个序列当中。
那么P有两种情况
-
P可以被一条经过点i,其中i属于我们点序列,的路径穿过。那么因为i的宝藏数比P的大(不然i就不会被选入序列中了),所以P肯定能被取完。 -
P不能被一条经过点i,其中i属于我们点序列,的路径穿过。那么P显然会被选入我们的序列。与P不在点序中矛盾。
-
- ∴ Ans≥y,Ans≤y → Ans=y
总结
- SAM还是掌握的不好。对于一些自己之前比较在行但很久没有打过的东西容易忘记。。所以还是要经常复习。
- 考试的时候脑洞没有打开。思维还是不行。
- 算法的实现做不到简洁。这样子其实容易使得自己无法对算法进行进一步的优化。拿到更多的算法。