1.17-1 最大子段和 (25 分)
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。
要求算法的时间复杂度为O(n)。
输入格式:
输入有两行:
第一行是n值(1<=n<=10000);
第二行是n个整数。
输出格式:
输出最大子段和。
输入样例:
在这里给出一组输入。例如:
6
-2 11 -4 13 -5 -2
结尾无空行
输出样例:
在这里给出相应的输出。例如:
20
结尾无空行
1.2算法描述
数组D[i]存储的是从第i个数开始到最后一个数的最大子段和,数组X[i]存储的是第i个数的数值,求解D[i]就要先将D[i+1]算出来再看D[i+1]的值是否大于0来决定D[i]是等于D[i+1]+X[i]还是等于x[i]。最后用max存最大的D[i]。
1.3问题求解
#include<iostream>
using namespace std;
int main(){
int n, max=X[n];
cin >> n;
int D[9999]={0};
int X[9999]={0};
for(int i=0; i<n; i++){
cin >> X[i];
}
for(int i=n-1; i>0; i--){
if(D[i+1]>0)
D[i]=X[i]+D[i+1];
else
D[i]=X[i];
if(D[i]>max)
max=D[i];
}
cout << max;
return 0;
}
1.1.1递归方程
If(D[i+1>0]D[i]=D[i+1]+X[i]
Else D[i]=X[i]
1.1.2表维度,范围,顺序
一维 1到n n到1
1.1.3
时间复杂度为O(n)
1.2心得体会
本次实验题目算是比较简单的,但是对于动态规划还有递归的一些基础性内容的理解还是不够透彻,不够经过老师同学的帮助还有北航课程,理解倒也深入了许多,非常有利于动态规划的学习。