多重循环和动态规划解决最大子数组问题

来源:互联网 发布:c# 高级编程教程 编辑:程序博客网 时间:2024/04/29 17:24

  最近看到最大子数组的问题,第一反应是用多重循环(直接简单)解决问题,看了一下网上其它的解决方法,发现用动态规划的方法可以以时间复杂度更小的方法来解决问题,写一篇日志权当总结。

  1.多重循环的方式比较暴力,从第一个元素开始累加,保留其中的最大值,探寻从第一个元素开始累加的话最大值是多少,并且保留在定义最大值数组的第一个元素。然后从第二个元素开始累加,重复上述过程,最后寻找最大值数组中的最大值,这个值便是我们所寻找的最大值

  2.动态规划的方法便较为巧妙:记sum=a[0]+....+a[n](sum假设是到目前为止的最大子数组的和),如果sum+a[n+1]<a[n+1],我们可以理解对于做最大和这件事来说,sum对于整个组合是有害的,所以我们将最大子数组的下标定为n+1,并且如果sum+a[n+1]>sum,那么我们可以将最大子数组终点的坐标设定在n+1,并且有可能随着数组的叠加继续后移,当然其中要保存最大值。

 相关代码如下,其中max_array函数是利用动态规划的方法解决问题,主函数则是多重循环的方法解决问题

 

#include <iostream>#include <vector>using namespace std;//max_subarray是利用动态规划的方法寻找最大子数组的和,复杂度较主函数中的暴力方法更小,运行时间更短int max_array(int *a, int len){int cursum, maxsum, start_p, end_p, tem = 0;int i;cursum = a[0];maxsum = a[0];for (i = 1; i < len; i++){cursum += a[i];if (cursum < a[i]){tem = i;cursum = a[i];}if (cursum > maxsum){start_p = tem;end_p = i;maxsum = cursum;}}return maxsum;}int main(){int n,i,j,sum=0,max=0,maxium;//输入的数组的长度int SumitUp[5000];cin >> n;vector<int>num(n);for (i = 0; i < n; i++){cin >> num[i];}for (i = 0; i < n; i++){for (j = i; j < n; j++){sum = sum + num[j];if (sum > max){max = sum;}}sum = 0;SumitUp[i] = max;}for (i = 0; i < n-1; i++){if (SumitUp[i + 1] > SumitUp[i]){maxium = SumitUp[i + 1];}else{maxium = SumitUp[i];}}cout << maxium<<endl;cout << max_array(num.data(), n) << endl;//调用max_array函数   return 0;}//对于求连续数组和的最大值,每次子循环结束,和必须重置为零//a.begin()返回的是一个迭代器,a.data()返回的才是内部数组的首地址int*


原创粉丝点击