课堂练习-返回一个整数数组中最大子数组的和
2016-03-25 15:46
507 查看
要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值(即最大连续和),要求时间复杂度为O(n)。
分析:
设b[i]表示以a[i]结尾的子数组的最大子段和,即:
b[i]=max{sum(a[j~k])},其中0<=j<=i,j<=k<=i。
因此对于数组a[0~n]的最大字段和为max{b[i]},其中0<=i<n。
在计算b[i]时,可以考虑以下三种情况:
1,b[i] = b[i-1]+a[i],当b[i-1]>0时,这时候的b[i]中包含a[i]。
2,b[i] = a[i],当b[i-1]<=0,这时候以a[i]重新作为b[i]的起点。
3,b[i]不包含a[i]的情况,这种情况在计算b[i]之前已经计算处结果,保存在b[0~i-1]中。最后计算max{b[i]}时会考虑到。
b[i] = max{ b[i-1]+a[i],a[i]}。
而数组a[0~n]则为max{b[i]}。
代码:
运行截图:
团队成员:张绍佳、杜文星(博客:/article/5589416.html)
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值(即最大连续和),要求时间复杂度为O(n)。
分析:
设b[i]表示以a[i]结尾的子数组的最大子段和,即:
b[i]=max{sum(a[j~k])},其中0<=j<=i,j<=k<=i。
因此对于数组a[0~n]的最大字段和为max{b[i]},其中0<=i<n。
在计算b[i]时,可以考虑以下三种情况:
1,b[i] = b[i-1]+a[i],当b[i-1]>0时,这时候的b[i]中包含a[i]。
2,b[i] = a[i],当b[i-1]<=0,这时候以a[i]重新作为b[i]的起点。
3,b[i]不包含a[i]的情况,这种情况在计算b[i]之前已经计算处结果,保存在b[0~i-1]中。最后计算max{b[i]}时会考虑到。
b[i] = max{ b[i-1]+a[i],a[i]}。
而数组a[0~n]则为max{b[i]}。
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<vector> using namespace std; int main() { vector<int>array; int n; char flag = 48; //48代表字符0 while (flag != 10 && flag != 13) //10代表换行键,13代表回车键 { cin >> n; flag = getchar(); //获取flag array.push_back(n); //将输入的数值添加到可变数值array的最后面 } const int m = array.size(); //dp[i]表示以array[i]作为末尾的连续序列的最大和 int dp[100]; dp[0] = array[0]; //边界 for (int i = 1; i < array.size(); i++) { /*最大连续序列之和只有两种情况,分别是: * 1.最大和的连续序列只有一个元素,即以array[i]开始,以array[i]结束,此时最大和就是array[i]本身 * 2.最大和的连续序列有多个元素,即从前面的某处的array[p]开始(p<i),一直到array[i]结尾 ,此时最大和为array[i]+dp[i-1]; */ dp[i] = max(array[i], dp[i - 1] + array[i]); } int k = 0; for (int i = 0; i<array.size(); i++) //求dp[]中的最大值 { if (dp[i]>dp[k]) { k = i; } } cout << dp[k]; return 0; }
运行截图:
团队成员:张绍佳、杜文星(博客:/article/5589416.html)
相关文章推荐
- ThinkPHP学习(二)
- python3的字符串格式化
- 怎么才能静下心来
- BZOJ2157旅游
- 责任成本汇总表
- Java(Android)线程池
- 1号店交易系统架构如何向「高并发高可用」演进
- Centos 6.5 升级系统到 Centos 7.0
- 关于服务器证书的基本资料
- iOS7 TextKit 框架的简单实用
- javascript
- 12 个 CSS 高级技巧汇总
- Kafka 技术文档
- (三)storm-kafka源代码走读之怎样构建一个KafkaSpout
- 关于CABasicAnimation —实现简单的滚动、平移、翻转、缩放动画
- LayoutInflater效率分析及源码跟踪
- 2016.3.25
- PAT (Advanced Level) Practise 1087 All Roads Lead to Rome (30)
- ActiveMQ学习教程(一)——安装与示例
- 把数据库干挂了