2021.09.06am
作者:互联网
|---|预期|实际|
|A|100|100|
|B|100|100|
|C|100|100|
|D|100|70|
|E|50|70|
|F|60|60|
|G|100|0|
|H|100|100|
|I|10|0|
|J|0|0|
|S|720|600|
A 石子合并 \(\blacktriangle\!\blacktriangledown\)
啊,经典区间DP,有手就行
B 对抗赛 \(\blacktriangle\!\blacktriangledown\)
1.这道题可以转化为凑总和的 \(1/2\)。
2. 每个数两种状态:选或不选。
3. \(dp[i][j]\) 表示 前 \(i\) 个数,和为 \(j\)
转移方程:
- 因为本题 \(\sum_{i=1}^n s[i]\) 较小,完全可以不用优化,但可以加个不大于前缀和的操作,以及滚掉一维等
- 大抵能从 \(O(n\sum_{i=1}^n s[i])\) 优化到 \(O(n^2)\)
C 演讲大厅安排 \(\blacktriangle\!\blacktriangledown\)
- 可以强制选择一个,看前面最长能贪多长
- 那么我们就可以按左端点进行排序,从最早开始的,一条一条地尝试拼上去。(要注意区间是左闭右开)
转移方程:
- 那么我们的时间复杂度为 \(O(n \log n+k^2)\)
- 接下来优化到 \(O(n\log n+k)\)
- 因为我们已经按左端点排序,左侧的点不会再被作为端点,那么左侧的 \(dp\) 值都可以取,那么我们只需要记住左侧 \(dp\) 值的最大值以更新即可。(考试的时候还憨地去写了个优先队列,后来发现根本没有取出的操作)
D 传纸条 \(\blacktriangle\!\blacktriangledown\)
也是道经典题,方格取数升级版,只不过同时走两条路径,让其现在的点和来的点都不重叠即可。因为访问到了不该访问到的地方而 \(WA30pts\)
E 守望者的逃离 \(\blacktriangle\!\blacktriangledown\)
- 不会写 \(DP\),只想到了贪心,不过时间复杂度比较优秀 \(O(T)\)
- 这道题我们稍微计算一下,可以发现:同样为 \(7s\) ,使用魔法能走 \(120m\),而走路为\(119m\),但当时间更短时走路反而更优(不考虑初始能量)也就是说,我们难以直接比较出来使用魔法与走路哪个更优。那么,我们就可以枚举其中之一所耗时间来看能否成立
- 为了方便表示等原因,我选择的是枚举停止的时间,也就是恢复的时间。
- 而因为这里的每一秒钟时基本等效,所以,我们可以把它看做先休息许久,然后直接
卡其脱离太 - 但是,要处理一些恶心人的特殊数据。比如,全部魔法,与只能全部走路之列的。
F 矩阵取数 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\)
本来吧,多好一道题,可惜出题人非得卡高精(就没写,懒得)。还是区间DP,状态转移很简单,要么先把左边的数选了,要么先把右边的数选了。
G 城市交通 \(\blacktriangle\)
这道题数据范围太小了,啥算法都能轻松过,我就写了个\(Dijkstra\) 水过去的。(但是样例输入错误+long long 挂掉了导致爆零)
H 最长公共子序列 \(\blacktriangle\)
太板了
I 玩具装箱 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\)
- 考试的时候想到的区间DP,一看空间复杂度 \(O(n^2)\) ,当场去世。就写了个时间复杂度 \(O(2^n)\) 的,
骗个10分没骗到 - 大概想到是斜率优化了
但是忘记咋写了 - 然后发现是没想到 \(O(n^2)\)的算法
- 那么先来一个 \(O(n^2)\)的DP方程:
那么这个式子就长得很像要斜率优化- 计算一下斜率依据:
- \(dp[j]+(sum[i]+i-sum[j]-j-L-1)^2<dp[k]+(sum[i]+i-sum[k]-k-L-1)^2\)
- \(dp[j]-dp[k]<(sum[i]+i-sum[k]-k-L-1-(sum[i]+i-sum[j]-j-L-1))*(sum[i]+i-sum[k]-k-L-1+(sum[i]+i-sum[j]-j-L-1))\)
- \(dp[j]-dp[k]<(sum[j]+j-sum[k]-k)*(2*(sum[i]+i-L-1)-sum[j]-sum[k]-j-k)\)
- \(\dfrac{dp[j]-dp[k]}{(sum[j]+j)-(sum[k]+k)}+(sum[j]+j)+(sum[k]+k)<2*(sum[i]+i-L-1)\)
- 这个地方\(sum[i]+i\) 满足递增,故可以单调队列优化,再通过斜率优化懂的都懂的操作,就可以 $O(n) $ 解决(不过要注意第一个位置要放0这个点)
J 最长公共上升子序列 \(\blacktriangle\!\blacktriangledown\)
- 笑死,模板,还讲过,整忘了,
然后心态崩了不想想了 - 先来一个 \(O(n^3)\)
- \(O(n^2)\)的公共套上O(n)的上升子序列
- 再来个 \(O(n^2)\)
- 我们可以利用一下求公共子序列的一些性质:匹配条件为 \(a[i]==b[j]\)
-当\(a[i]>b[j]\) 时,\(a[i]\) 与 \(b[j]\) 一定不能匹配。但\(b[j]\) 可能与 \(a[k](k<i)\)匹配。也就是说,不包括 \(a[i]\) 的最长子序列可能是以 \(b[j]\) 结尾。而\(a[i-1]\) 的所有最长匹配在上一轮都会算出,那么我们就可以再内层循环同时\(O(1)\)更新不包括 \(a[i]\) 的最长子序列,时间复杂度就优化到 \(O(n^2)\) 了
\(\cal {Made} \ {by} \ {YuGe}\)
- 我们可以利用一下求公共子序列的一些性质:匹配条件为 \(a[i]==b[j]\)
标签:sum,2021.09,06am,blacktriangledown,DP,blacktriangle,100,dp 来源: https://www.cnblogs.com/u2003/p/15235343.html