题目:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8。问题输入就是一个数组,输出该数组的“连续子数组的最大和”。
1、暴力法
枚举出所有的子序列,求出最大和数值。比如对于从i开头的子序列有N-i个子序列。
2、动态规划法
用f(i)表示第i个数字结尾的子序列的最大和,那么求max[f(i)]可以总结下面递归公式:
f(i) = max( arr[i] , f(i-1)+arr[i] ) 0<= i< n
#include<iostream>
using namespace std;
int MaxSub(int arr[], int N){
//cursum记录当前子序列和,maxsum记录最大和
//暴力法
int cursum = 0;
int maxsum = 0;
int i, j, k;
for(i=0;i<N;i++){
cursum = 0;
for(j=i;j<N;j++){
cursum += arr[j];
if(cursum>maxsum){
maxsum = cursum;
}
}
}
return maxsum;
}
int MaxSub_DP(int arr[], int N){
//DP法
int maxsum = 0;
int cursum = 0;
int i;
for(i=