ACM学习总结(六)(21.4.17)

本周依然学习的动态规划(线性DP),详细的解说见1 2

总结几个最近做线性DP题的技巧:

•怎么找状态,从题目要求上推,一般题目最后一句是入手点,比如最近见到的几个题:M分钟后到达第T棵树,不难想到状态为i分钟后到达第j棵树
n件物品取k对,可以把前i件物品已经取了j对作为状态
数n表示1~n和长度k,联想到状态为以数j结尾,长度为i,构建二维数组dp[i][j]来表示

•状态的值的确定,一般就是题目要求的输出的值,多为一维数组,也有一些二维数组。如题目要求输出最大和,那么状态的值就是该状态下的最大和。也有一些题例外,因为选取方式的不同,最后的结果可能需要在某一i的情况下求1~j的和或1~j中最大的,这里一般为构造方案的题,一般需要第三个量k,k也有一定的范围,其动态转移方程类似dp[i+1][k]=(dp[i+1][k]+dp[i][j])(1<=k<=n),如雇佣工人,Mashmokh and ACM,一般比较好确定。

•动态转移方程怎么找,这是最让我头疼的一点,常常做题时状态确定好了,值也确定了,但是不会列转移方程。通俗的说法是由前一个状态确定后一个状态,但是前一个状态是啥呢我们又不知道了,所以我们要考虑的不是前一个状态是啥,而是状态之间的联系,假设前一个状态我们已经知道了,我们要想这个状态进入下一个状态的途径或方式,比如有的构造方案题,假设dp[i][j]中的j代表j位置的数,我们考虑要不要选j位置这个数,那么就有两种构造方式,一种是选j那么就要在前一个状态上+1表示选的个数,如果不选j,那么这个数就等于前一个状态的个数,注意两种方式下的前一个状态不一定是同一个状态,这就有点像一个岔路口,这个岔路口可由不同的路进入,也就是由不同的方案到达,我们选一个最优的,以此作为推下一个状态的条件。总之我们的考虑方向是前一个状态由什么样的方案进入下一个状态,由多少个方案进入下一个状态。

•状态转移方程也列出了,我们写循环语句的时候就需要注意了,首先循环是从什么起点开始的,边界条件的初始状态,有时候因为这一小点问题就导致整个题目做错。

再说说最近做cf训练题的心得吧,现在基本上达到了偏易题快速读懂,快速解决并能做对,偏难题,能看懂题意,想个大概,但代码实现有点复杂,需要反复测试才可能过的程度,距离目标水平还有一定的距离。再说说做题,最近做的几个题,训练的时候我的思路和方法比较复杂,过后补题,发现很多题用map解决会很简单,有些较复杂的题,我直接暴力枚举,结果时间限制,过后发现可以用二分解决。今天上午训练了一道题,因为题目没告诉要多组输入结果我错了好多遍,有点郁闷。还有一道麻将题,没打过麻将的我看不懂题目的描述,看了半个小时才明白,和队友研究了好久,我们用的最朴素的方法去解决,结果最后时间结束了也还没有改对,过后发现是题目的一个限制条件理解错了,最后过了。赛后补题看到很多大佬们用map就很容易把题解决了,因为我们不会用,所以解决的很费劲。对比大佬们的代码,还有很多知识需要我去学习,祝我最后也能成为大佬(ง •̀_•́)ง

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值