算法第三章上机实验报告

1. 实践报告任选一题进行分析。内容包括:

1.1 问题描述

7-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 算法描述

参考自课本第四版 最大子段和的动态规划算法

 添加一个一维数组b[n+1],b[j](1<=j<=n)表示以a[j]结尾的最大子段和,逐个对b[i]进行填表,表中最大值即为最大子段和。

1.3 问题求解:

 1 #include<iostream>
 2 using namespace std;
 3 int MAXSum(int n,int *a)
 4 {
 5    int sum=0,b=0;
 6    for(int i=1;i<=n;i++)
 7    {
 8      if(b>0) b+=a[i];12      else b=a[i];
13      if(b>sum)
14       sum=b;
15    }
16    return sum;
17  }
18 int main()
19 {
20    int n,sum=0;
21    int a[n+1]={0};
22    cin>>n;
23    for(int i=1;i<=n;i++)
24    {
25       cin>>a[i];
26    }
27    cout<<MAXSum(n,a);
28    return 0;
29 }

1.1.1 根据最优子结构性质,列出递归方程式

b[j]=min{b[j-1]+a[j], a[j]}   1<=j<=n

1.1.2 给出填表法中表的维度、填表范围和填表顺序。

表为一维表格;填表范围为1-n;填表顺序是从b[1]填到b[n].

1.1.3 分析该算法的时间和空间复杂度

时间复杂度和空间复杂度均是O(n)

1.3 心得体会(对本次实践收获及疑惑进行总结)

能写出递归方程式很重要,帮助自己理清思路,不至于思绪混乱。但是递归好难想出来。

2. 你对动态规划算法的理解和体会

动态规划是递归定义最优值,自顶向上的方式计算出最优值,递归方法和式子要会写,理清递归的地方,才能更好写出动态规划算法。

posted @ 2021-10-26 23:57  borntodie  阅读(28)  评论(0编辑  收藏  举报