算法第三章上机实验报告
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. 你对动态规划算法的理解和体会
动态规划是递归定义最优值,自顶向上的方式计算出最优值,递归方法和式子要会写,理清递归的地方,才能更好写出动态规划算法。