Loading... 可以看看文章 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://blog.csdn.net/hollis_chuang/article/details/103045322?utm_source=app&app_version=4.13.0&code=app_1562916241&uLinkId=usr1mkqgl919blen" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-content" style="margin-left: 10px;"> <p class="inser-title">CSDN @ Hollis Chuang</p> <div class="inster-summary text-muted"> 告别动态规划,连刷40道动规算法题,我总结了动规的套路 </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> 不扯别的了,直接上题!!! # 例题1:最大区间和 给定**K**个整数组成的序列{ **N****1******, **N****2******, ..., **N****K****** },“连续子列”被定义为{ **N****i******, **N****i****+****1******, ..., **N****j****** },其中 **1** **≤****i****≤****j****≤** **K**。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。 本题旨在测试各种不同的算法在各种数据情况下的表现。 ### 输入格式: 输入第1行给出正整数**K** (**≤** **100000**);第2行给出**K**个整数,其间以空格分隔。 ### 输出格式: 在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。 ### 输入样例: ```in 6 -2 11 -4 13 -5 -2 ``` ### 输出样例: ```out 20 ``` <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-67da4629437480e99763c336b62ded0118" aria-expanded="true"><div class="accordion-toggle"><span style="">【算法分析】</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-67da4629437480e99763c336b62ded0118" class="collapse collapse-content"><p></p> 可以使用前缀和完美解决,但动态规划思路更清晰。 直接想法:dp[i]表示前 i 个数中最大区间和,但是难以维护,效率低。 改进dp:dp[i] 表示以第 i 个数结尾的区间的区间和最大值,dp数组最大值为答案,全为负则为0。 状态转移方程dp[i] = max(a[i],a[i] + dp[i - 1]) 计算dp[i]只需要dp[i - 1] 和 a[i],所以 dp 数组和 a 数组可以滚动(可以不用数组记录):dp = max(a,a+dp) 时间复杂度$O(N)$,空间复杂度$O(1)$。 <p></p></div></div></div> <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-22298dfc1db30c1c4a0535be067c061811" aria-expanded="true"><div class="accordion-toggle"><span style="">【参考程序】</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-22298dfc1db30c1c4a0535be067c061811" class="collapse collapse-content"><p></p> - 滚动 ```cpp #include <iostream> using namespace std; int max(int a, int b) { if(a > b) return a; else return b; } int N,a,dp,ans; int main() { int i; cin >> N; for(i = 1; i <= N; i++) { cin >> a; dp = max(a,a + dp); ans = max(ans,dp); } cout << ans <<endl; return 0; } ``` - 不滚动 ```cpp #include <iostream> using namespace std; int max(int a, int b) { if(a > b) return a; else return b; } int N,a[100],dp[100],ans; int main() { int i; cin >> N; for(i = 1; i <= N; i++) { cin >> a[i]; dp[i] = max(a[i],a[i] + dp[i - 1]); ans = max(ans,dp[i]); } cout << ans <<endl; return 0; } ``` <p></p></div></div></div> 最后修改:2021 年 09 月 12 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏