20221208学习总结
学习动态规划。
t1:在长度为 的序列中任选连续一段数,使和最大。
可见 p1115 。
使用 dp 的思想解决。
定义原问题与子问题
需要对最后一段或者第一段进行分类讨论。
子问题:选了 n-1 个数的时候的连续和最大是多少。
但是有问题,这样的子问题势必产生后效性。
为什么?
例:1 2 3 4 -1 -1 -1 -1 -1 6
取到“6”的时候,就会发现 n-1 个时最大和,是“1 2 3 4”。 但是取时,不能选,中间的 -1 同样是要选的。
把思路转换一下,如何解决“隔空取物”的现象?
如果要看 n 选不选,肯定要选 n-1 ,如何确定 n-1 必定是一个状态的结尾呢?
只要改变这个状态。
变成以 n-1 结尾的连续和最大是多少。
确定子问题后,就要想如何把原问题与子问题联系起来。
把最后一个数提出来,分类讨论, 2 种情况:
-
直接取单独的数
-
在之前的数的基础上把当前数加上去
所以状态方程为:dp[i]=max(dp[i-1]+a[i],a[i]);
其实也可以认为,如果之前的加的一段和已经 <0 ,不如新开一段。
代码:
在此基础上,可引出 t2
t2
在长度为 n 的序列中,选取一段不相邻的数,使和最大。
还是要对最后一个进行分类讨论。
例:1 2 3 4 -1 -1 -1 -1 -1 6
把 6 单独看,可以分两类:
-
选 那就要看到之前
-
不选
本文作者:cjrqwq
本文链接:https://www.cnblogs.com/yfzqwq/p/18492841
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步