解决最大连续子序列和的两种方法:分治,动态规划。
分治时间复杂度虽然更高,但我还是写了一遍加深对这种思想的理解:将一个问题分治成若干个小的同样思路的子问题来解决。本题将所求序列等分成左右两个子序列,愿序列的最大子序列和必是左序列最大子序列和,有序列最大子序列和,跨左右子序列最大和三者中的最大者。
动态规划:用dp[i]更新dp[i+1]就行。
分治:
//
// main.cpp
// 1109
//
// Created by Fangpin on 15/3/9.
// Copyright (c) 2015年 FangPin. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[104];
int f(int l,int r){
int m=(l+r)>>1;
if(l>=r) return a[l];
int left=f(l,m);
int right=f(m+1,r);
int mid=-1e10,sum=0;
for(int i=m;i>=0;--i){
sum+=a[i];
mid=max(mid,sum);
}
sum=0;
int maxn=-1e10;
for(int i=m+1;i<=r;++i){
sum+=a[i];
maxn=max(maxn,su