Riiichard

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  6 随笔 :: 0 文章 :: 0 评论 :: 193 阅读

这周的比赛似乎稍微有些起色(?),不过还是遇到了一些问题,倘若是单纯能力不足也就罢了,但往往会犯一些难以言喻的蠢。

老规矩放题:

链接:https://ac.nowcoder.com/acm/contest/23479/D
来源:牛客网

今年的雪来得格外的早。雪把大地染成一片橙色。

小红正在雪地中奔跑。雪地可以看成是一个二维平面,小红的初始坐标是 (x0,y0),她每秒有个方向向量 (xi,yi),会沿着该方向直线奔跑1秒(例如,第一秒之后,小红的坐标就变成了 (x0+x1,y0+y1)。小果站在坐标 (x,y)处原地不动。小红想知道,在跑步过程中,自己和小果的最短距离是多少?

 

这道题我看赛后的解答,对于距离的计算进行了简化,当时我分类之后,前一类用的是向量积来判断小红的移动轨迹与小果坐标到结点连线夹角的大小,这一步上面没什么问题,但之后计算第二种情况,也就是当小果到小红的距离是他到小红轨迹的垂线段长度时,因为前一种用了向量,自然想要用向量来表示这种情况的距离,结果愣是卡了半天,实际上用三角形面积即可,这本应是我能想到的,却被自己的思维限制。

还有一题:

链接:https://ac.nowcoder.com/acm/contest/23479/I
来源:牛客网

小红正在研究如何把符卡组合出尽可能大威力的组合魔法。

小红共有 n 种符卡可以选择,每种符卡最多只能选择一次,每个符卡的魔力消耗为 ai,威力为 bi
如果将多个符卡进行组合,则可以发动一个组合魔法。组合魔法的魔力消耗为选择的符卡的魔力消耗的总和,其威力为选择的符卡的威力的总和。
小红必须保证最终符卡的魔力消耗总和为 k 的倍数,否则小红将受到魔力反噬而发动魔法失败。
小红想知道,自己能发动的组合魔法最大的威力是多少?

 

很好,又是dp,又没做出来。在拿到这道题的时候,我当时看了下通过率,还是可以的,然后点进去发现是dp,其实是有点虚的。

dp是很容易看出来的,问题在于状态转移方程怎么写,之前看了很多dp的内容,上手实操就有点难以言喻了,因为限制条件是要求为k的倍数,所以和平时做的都不一样,结果又做不出,说实话很受打击。

题解的写法是

dp[i][j]=max(dp[i][j],dp[i-1][(j-a[i][0]%k+k)%k]+a[i][1]);

 

其中a数组第一项记录了魔力消耗,第二项记录了魔法的威力,dp[i][j]先是记录了不取第i张的值,然后进行比较(话说为什么要这样),重点是dp数组的第二维下标表示,取的是对k的模,因为这样一来就能够如上述代码所表示的,用j-a[i][0]%k来搜索前一项的值,当然还要经过+k保证非负再取模的处理。

这题主要难点(对于笔者来说),就是状态转换方程的具体实现,dp的状态转换本质上是将前一项这一抽象概念用限制条件来具体化,像这道题因为限制条件是为k的倍数,所以要去找j-a[i][0]%k的前一项,这么说可能有些摆,我觉得dp的代码不用去每次都死推一遍,可以尝试用限制条件套,再用测试例去验证,在尚不能熟练运用dp来解题的时候,也是无奈之举。

posted on   Riiichard  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示