最大子段和算法 不同复杂度方法实现
来源:互联网 发布:json和js对象的区别 编辑:程序博客网 时间:2024/06/05 19:02
没事写写算法,连连脑子。
简单的实现最大子段和算法,所谓最大子段和,简单来说就是给定数列中,求连续数字和中最大的;
如数列-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) 枚举法1void 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;}
0 0
- 最大子段和算法 不同复杂度方法实现
- 不同时间复杂度实现最大子段和
- 最大子列和问题的四种不同时间复杂度的算法实现
- 最大子序列和的四种不同复杂度实现
- 最大子序列和的四种不同复杂度实现
- 求数列的最大子段和的两种方法(包括时间复杂度为线性时间的算法)
- 最大子段和算法
- 最大子段和算法
- 最大M子段和 辅助数组降低时间复杂度
- 最大子段和详解 (各种复杂度)
- 最大子序列的不同时间复杂度算法
- 最大子数组 三种不同复杂度的算法
- 最大子列和问题的不同实现算法
- 【算法设计】最大子段和问题
- 最大子段和 各种算法讨论
- 最大子段和几种算法
- 【经典算法】 最大子段和
- 【算法】最大子段和问题
- 固件挂载
- erlang文件操作
- Android 隐式意图和显示意图
- Go 语言中 channel 使用总结
- 解析XML时,org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 449: not well-forme
- 最大子段和算法 不同复杂度方法实现
- Java高效编程之二【对所有对象都通用的方法】
- Ubuntu下手机USB 显示??? insufficient permissions for device
- D3D中的世界矩阵,视图矩阵,投影矩阵
- JS字符串拼接的问题
- foreach使用方法 和 枚举使用方法
- Pick Game
- "The MathType DLL cannot be found.Please reinstall MathType"问题解决
- Linux oracle 10g 修改数据库的sid和dbname