当前位置:   article > 正文

杭电OJ 1024(C++)_杭电oj1024

杭电oj1024

这一题花了很长时间,补了动态规划的知识,参考了几篇博客。

https://www.cnblogs.com/dongsheng/archive/2013/05/28/3104629.html

https://blog.csdn.net/aaaliaosha/article/details/77163512

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. const int N = 1000010;
  5. int m, n;
  6. int num[N]; //长度超过一百万的数组不能定义在函数内部,否则造成栈溢出
  7. int dp[N]; //dp[j]存储以num[j]结尾的前j个数中,分成i段的最大值
  8. int pre[N]; //pre[j]存储前j个数中(不一定以num[j]结尾),分成i段的最大值
  9. int max(int a, int b)
  10. {
  11. return a > b ? a : b;
  12. }
  13. int main()
  14. {
  15. while (cin >> m >> n)
  16. {
  17. for (int i = 1; i <= n; i++) //读入数据
  18. cin >> num[i];
  19. num[0] = 0;
  20. memset(dp, 0, sizeof(dp)); //初始化数组dp
  21. memset(pre, 0, sizeof(pre)); //初始化数组pre
  22. int Sum;
  23. for (int i = 1; i <= m; i++) //自底向上动态规划,规模大的解完全依赖于规模小的解
  24. {
  25. Sum = -9999999;
  26. for (int j = i; j <= n; j++)
  27. {
  28. dp[j] = max(dp[j - 1], pre[j - 1]) + num[j];
  29. pre[j - 1] = Sum;
  30. Sum = max(Sum, dp[j]);
  31. }
  32. }
  33. cout << Sum << endl;
  34. }
  35. return 0;
  36. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/645525
推荐阅读
相关标签
  

闽ICP备14008679号