标签:结果 输出 划算 数组 改变 简单 方法 遍历 cin
一、实践题目
二、问题描述
(1)题目关键字:n个整数 序列 子段和 最大值
(2)思路:先定义要输入的整数个数n、用来存放整数的数组a[n](算法中200的空间是任意给的,保证运行空间充足)、存放最大子段和的整型变量sum以及循环过程中数值大小会随条件改变用来记录最大子段和的整型变量b。一开始先按题目要求依次输入整数个数以及数组内存放的整数,然后通过新的循环计算最大子段和。b的初始值为0,根据循环内语句的条件,先将数组内第一个元素的值赋给b,此时b小于零,b不用对sum进行赋值,然后对b是否大于零进行判断,若b大于零,则将新的元素对应的值叠加到b上;若b小于零,则b继续接受对应元素的赋值。若b大于sum,则更新最大子段和的值,否则保留原来的记录。循环结束后输出sum即最大子段和的值。
三、算法描述
#include<iostream>
using namespace std;
int main(){
int n,a[200],sum=0,b=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
if(b>0) b+=a[i];
else b = a[i];
if(b>sum) sum = b;
}
cout<<sum;
return 0;
}
四、算法时间及空间复杂度分析
时间复杂度:O(n)
这道题目的关键算法是动态规划算法,该算法通过循环n次遍历整个数组得出最大子段和,所以时间复杂度为O(n)。
空间复杂度:O(n)
整个动态规划算法只申请了n个空间存放数组中的元素,没有申请别的空间。
五、心得体会
求最大子段和的算法有很多种,书上介绍的简单算法、分治算法和动态规划算法这三种算法较为普遍。每一种方法都各有它的优缺点,不过选择更合适题目的算法能更高效地输出答案。在这道题目中用动态规划算法将一个问题分解成几个小问题能在更短的时间内计算出结果,而且动态规划所使用的语句也更加简洁。题目相对简单,所以在上机的时候没花多长时间就完成了,但是对动态规划算法的掌握仍然不够扎实,日后还需要多练习相应的题目熟悉该算法的根本方法。
标签:结果 输出 划算 数组 改变 简单 方法 遍历 cin
原文地址:https://www.cnblogs.com/RenaJun/p/11700828.html