算法第三章上机实践报告

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. 你对动态规划算法的理解和体会

动态规划思想与分治法类似,都是将问题分解为多个子问题,通过求解子问题来得到最终答案,而动态规划的优势在于,动态规划防止了子问题的重复计算,每个问题只计算一次,自底向上地求出原问题的解。动态规划与其它算法相比,大大减少了计算量,丰富了计算结果,不仅求出了当前状态到目标状态的最优值,而且同时求出了到中间状态的最优值,这对于很多实际问题来说是很有用的。动态规划相比一般算法也存在一定缺点:空间占据过多,但对于空间需求量不大的题目来说,动态规划无疑是最佳方法!动态规划算法没有一个固定的解题模式,技巧性很强。

 

posted @ 2021-10-26 23:54  刘瑾怡  阅读(30)  评论(0编辑  收藏  举报