ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021.09.06am

2021-09-06 20:04:34  阅读:186  来源: 互联网

标签:sum 2021.09 06am blacktriangledown DP blacktriangle 100 dp


|---|预期|实际|
|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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有