没事写写算法,连连脑子。
简单的实现最大子段和算法,所谓最大子段和,简单来说就是给定数列中,求连续数字和中最大的;
如数列-2,7,-6,9,4,2,-4,5。最大子段和是7+-6+9+4+2+-4+5 = 17,以下给出各种策略的实现代码
// main.cpp
// LSS_1
// Created by zhaowei on 14-3-26.
// Copyright (c) 2014年 zhaowei. All rights reserved.
#include <iostream>
using namespace std;
//O(n^3) 枚举法
void lSS(int *a,int len){
int max = -9999;//最大负数
int sum = 0;
int maxi = 0;//最大子段起点
int maxj = 0;//最大子段终点
for (int i = 0; i<len; i++) {
for (int j = 0; j<len; j++) {
sum = 0;
for (int k = i; k<=j; k++) {
sum+=a[k];
}
if (sum>max) {
max = sum;
maxi = i;
maxj = j;
}
}
}
cout<<"maxi :"<<maxi<<endl;
cout<<"maxj :"<<maxj<<endl;
cout<<"LSS :"<<max<<endl;
}
//O(n^2) 枚举法1
void lSS_1(int *a,int len){
int max = -9999;
int maxi = 0;//最大子段起点
int maxj = 0;//最大子段终点
int temp;
int *sum = newint[len];
sum[0] = a[0];
for (int i = 1; i<len; i++) {
sum[i] = sum[i-1] + a[i];
//cout<<sum[i]<<" ";
}
//cout<<endl;
for (int j = 0; j<len; j++) {
for (int k = 0; k<len; k++) {
temp = sum[k] - sum[j];
if (temp>max) {
max = temp;
maxi = j+1;
maxj = k;
}
}
}
cout<<"maxi :"<<maxi<<endl;
cout<<"maxj :"<<maxj<<endl;
cout<<"LSS :"<<max<<endl;
}
//分治策略的子函数
int crossMax(int *a,int p,int q,int r){
int lSum = -9999;
int rSum = -9999;
int sum = 0;
for (int i = q; i>=0; i--) {
sum+=a[i];
if (sum>lSum) {
lSum = sum;
}
}
sum = 0;
for (int j = q+1; j<=r; j++) {
sum+=a[j];
if (sum>rSum) {
rSum = sum;
}
}
// cout<<"l+r"<<lSum+rSum<<endl;
return lSum+rSum;
}
//O(nlogn) 分治策略
int lSS_2(int *a,int p,int r){
int q = (p+r)/2;
int lMax = 0;
int rMax = 0;
int mMax = 0;
if (p == r) return a[p];
else {
lMax =lSS_2(a, p, q);
rMax =lSS_2(a, q+1, r);
mMax =crossMax(a,p,q,r);
}
//cout<< lMax<<" "<<rMax<<" "<<mMax<<endl;
if (lMax>=rMax&&lMax>=mMax) {
return lMax;
}
else if(rMax>=lMax&&rMax>=mMax)
return rMax;
else return mMax;
}
//O(n) 动态规划
int lSS_3(int *a,int n)
{
int sum = 0,b = 0;
int maxi = 0;
int maxj = 0;
int i;
for (i=0;i<n;i++)
{
if(b>0)
b+=a[i];
else{
b = a[i];
maxi = i;
maxj = i;
}
if(b>sum){
sum = b;
maxj = i;
}
}
cout<<maxi<<"<---->"<<maxj<<endl;
return sum;
}
int main(int argc,const char * argv[])
{
// insert code here...
int a[8] = {-2,7,-6,9,4,2,-4,5};
lSS(a, 8);
lSS_1(a, 8);
cout<<"LSS2 :"<<lSS_2(a, 0, 7)<<endl;
cout<<"LSS3 :"<<lSS_3(a,8)<<endl;
return 0;
}