其他分享
首页 > 其他分享> > 2021.09.06am

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\)
转移方程:

\[dp[i+1][j]+=dp[i][j] \]

\[dp[i+1][j+s[i]]+=dp[i][j] \]

  1. 因为本题 \(\sum_{i=1}^n s[i]\) 较小,完全可以不用优化,但可以加个不大于前缀和的操作,以及滚掉一维等
  2. 大抵能从 \(O(n\sum_{i=1}^n s[i])\) 优化到 \(O(n^2)\)

C 演讲大厅安排 \(\blacktriangle\!\blacktriangledown\)

  1. 可以强制选择一个,看前面最长能贪多长
  2. 那么我们就可以按左端点进行排序,从最早开始的,一条一条地尝试拼上去。(要注意区间是左闭右开)
    转移方程:

\[ dp[b[i]]=\max(dp[b[i],dp[k]+b[i]-a[i]),0<k<=a[i] \]

  1. 那么我们的时间复杂度为 \(O(n \log n+k^2)\)
  2. 接下来优化到 \(O(n\log n+k)\)
  3. 因为我们已经按左端点排序,左侧的点不会再被作为端点,那么左侧的 \(dp\) 值都可以取,那么我们只需要记住左侧 \(dp\) 值的最大值以更新即可。(考试的时候还憨地去写了个优先队列,后来发现根本没有取出的操作)

D 传纸条 \(\blacktriangle\!\blacktriangledown\)

也是道经典题,方格取数升级版,只不过同时走两条路径,让其现在的点来的点都不重叠即可。因为访问到了不该访问到的地方而 \(WA30pts\)

E 守望者的逃离 \(\blacktriangle\!\blacktriangledown\)

  1. 不会写 \(DP\),只想到了贪心,不过时间复杂度比较优秀 \(O(T)\)
  2. 这道题我们稍微计算一下,可以发现:同样为 \(7s\) ,使用魔法能走 \(120m\),而走路为\(119m\),但当时间更短时走路反而更优(不考虑初始能量)也就是说,我们难以直接比较出来使用魔法与走路哪个更优。那么,我们就可以枚举其中之一所耗时间来看能否成立
  3. 为了方便表示等原因,我选择的是枚举停止的时间,也就是恢复的时间。
  4. 而因为这里的每一秒钟时基本等效,所以,我们可以把它看做先休息许久,然后直接卡其脱离太
  5. 但是,要处理一些恶心人的特殊数据。比如,全部魔法,与只能全部走路之列的。

F 矩阵取数 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\)

本来吧,多好一道题,可惜出题人非得卡高精(就没写,懒得)。还是区间DP,状态转移很简单,要么先把左边的数选了,要么先把右边的数选了。

G 城市交通 \(\blacktriangle\)

这道题数据范围太小了,啥算法都能轻松过,我就写了个\(Dijkstra\) 水过去的。(但是样例输入错误+long long 挂掉了导致爆零)

H 最长公共子序列 \(\blacktriangle\)

太板了

I 玩具装箱 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\)

  1. 考试的时候想到的区间DP,一看空间复杂度 \(O(n^2)\) ,当场去世。就写了个时间复杂度 \(O(2^n)\) 的,骗个10分没骗到
  2. 大概想到是斜率优化了 但是忘记咋写了
  3. 然后发现是没想到 \(O(n^2)\)的算法
  4. 那么先来一个 \(O(n^2)\)的DP方程:

\[dp[i]=\min(dp[j]+(sum[i]+i-sum[j]-j-L-1)^2),0\leq j < i \]

  1. 那么这个式子就长得很像要斜率优化
  2. 计算一下斜率依据:
    • \(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)\)
  3. 这个地方\(sum[i]+i\) 满足递增,故可以单调队列优化,再通过斜率优化懂的都懂的操作,就可以 $O(n) $ 解决(不过要注意第一个位置要放0这个点)

J 最长公共上升子序列 \(\blacktriangle\!\blacktriangledown\)

  1. 笑死,模板,还讲过,整忘了,然后心态崩了不想想了
  2. 先来一个 \(O(n^3)\)
    • \(O(n^2)\)的公共套上O(n)的上升子序列
  3. 再来个 \(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)\) 了
      image
      \(\cal {Made} \ {by} \ {YuGe}\)

标签:sum,2021.09,06am,blacktriangledown,DP,blacktriangle,100,dp
来源: https://www.cnblogs.com/u2003/p/15235343.html