算法第三章上机实践报告
1.1问题描述
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。
要求算法的时间复杂度为O(n)。
1.2算法描述
#include<bits/stdc++.h>
using namespace std;
const int N = 10005;
int a[N];
int MaxSum(int C[],int n)
{
int sum = 0;
int tempSum = 0;
for(int i = 0;i < n;i++)
{
tempSum = (tempSum + C[i]) > C[i] ? (tempSum + C[i]) : C[i];
if(tempSum > sum)
{
sum = tempSum;
}
}
return sum;
}
int main()
{
int n;
cin>>n;
for(int i = 0;i < n;i++)
{
cin>>a[i]
}
int maxSum = MaxSum(a,n);
cout<<maxSum;
return 0;
}
1.3问题求解:
1.1.1 根据最优子结构性质,列出递归方程式
sum = max{tempsum+c[i],c[i]};
令tempSum初始化为0,当C[i]>0时,tempsum = tempsum+c[i],否则tempsum=c[i]
1.1.2 给出填表法中表的维度、填表范围和填表顺序
表的维度:一维
填表范围:1到n
填表顺序:从左向右
1.1.3 分析该算法的时间和空间复杂度
时间复杂度:仅有一重循环,所以为O(n)
空间复杂度:O(n)
1.3 心得体会(对本次实践收获及疑惑进行总结)
这节课的练习让我理解以及更加熟悉了动态规划的思想,构思递归方程式的过程中对题目以及算法有了更透彻的理解,明白了动态规划的重要性和好处,在遇到复杂的问题时可以选择使用动态规划来有效减少计算量。
2. 你对动态规划算法的理解和体会
动态规划思想与分治法类似,都是将问题分解为多个子问题,通过求解子问题来得到最终答案,而动态规划的优势在于,动态规划防止了子问题的重复计算,每个问题只计算一次,自底向上地求出原问题的解。动态规划与其它算法相比,大大减少了计算量,丰富了计算结果,不仅求出了当前状态到目标状态的最优值,而且同时求出了到中间状态的最优值,这对于很多实际问题来说是很有用的。动态规划相比一般算法也存在一定缺点:空间占据过多,但对于空间需求量不大的题目来说,动态规划无疑是最佳方法!动态规划算法没有一个固定的解题模式,技巧性很强。