博客
关于我
【dp】51nod 1052 最大M子段和
阅读量:625 次
发布时间:2019-03-14

本文共 1140 字,大约阅读时间需要 3 分钟。

#include 
using namespace std;typedef long long LL;const int N = 5e3 + 5;const LL INF = 0x3f3f3f3f;LL a[N], dp[N], pre[N];int main() { int n, m; scanf("%d%d", &n, &m); int num = 0; LL ans = 0; for (int i = 1; i <= n; ++i) { scanf("%lld", &a[i]); if (a[i] > 0) { ans += a[i]; num++; } } if (num <= m) { printf("%lld\n", ans); } else { for (int i = 1; i <= m; ++i) { ans = -INF; for (int j = 1; j <= n; ++j) { if (j == 1) { dp[j] = a[j]; } else { dp[j] = max(pre[j-1], dp[j-1]) + a[j]; } pre[j-1] = ans; ans = max(ans, dp[j]); } pre[n] = ans; } printf("%lld\n", pre[n]); } return 0;}

上述代码实现了一个动态规划算法,主要用于解决两个变量的问题。代码首先读取输入值n和m,然后读取数组a中的元素。对于数组a中的正数元素,程序会将它们累加到总和ans中,并统计这些正数的数量num

如果num小于等于给定的m值,程序直接输出当前的ans值。如果num大于m值,程序将使用动态规划的方法来求解最优解。在动态规划部分,程序维护了两个辅助数组dppre,分别用于存储当前状态和前一步的最大值。通过遍历数组a,程序逐步构建最优解,并更新最大值ans。最后,程序输出最终的最大值。

整个算法的时间复杂度主要取决于数组a的长度n,复杂度为O(n*m),适用于较小规模的n和m值。

转载地址:http://gnaoz.baihongyu.com/

你可能感兴趣的文章
Python爬虫训练:爬取酷燃网视频数据
查看>>
Python新一代数据可视化神器:Plotly动画展示
查看>>
Python数据分析入门(十九):绘制散点图
查看>>
springboot所有配置文件全部失效,不显示Idea Error: Module not specified;
查看>>
苹果a14和骁龙888哪个厉害 苹果a14相当于骁龙多少
查看>>
大佬谈接口自动化,我是这样做测试框架开发的……
查看>>
vue中常见的指令
查看>>
IOS——objective-c
查看>>
Codeforces Round #699 (Div. 2) A B
查看>>
PC-Lint 使用中头文件包含的问题,以及VSCode中文乱码问题
查看>>
备受关注的区块链技术应用领域都有哪些?
查看>>
tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案
查看>>
关于InputStream类的available()方法
查看>>
1014福尔摩斯的约会 (20) 题解代码
查看>>
图片懒加载
查看>>
【模拟】ZOJ Problem Set - 3490 String Successor
查看>>
【母函数初学,其他简便方法】Holding Bin-Laden Captive! hdoj 1085
查看>>
【思维】hdu 5832 A water problem 2016icpc网络赛
查看>>
hdu 5878 I Count Two Three(二分)
查看>>
王道数据结构2.2.3——13、找出整数数组中未出现的最小正整数
查看>>