算法第三章上机实践报告
1.实践报告
1.1 问题描述
1.2 算法描述
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int sum=0,b=0; for(int i=1;i<=n;i++) { int a; cin>>a; if(b>0) { b+=a; } else b=a; if(b>sum) { sum=b; } } cout<<sum<<endl; return 0; }
设D[i] 代表第i个数到n的最大子段和,如果a[i]<=0,D[i]=D[i+1],否则D[i]=D[i+1]+a[i];若a[n]<=0,根据题目要求D[n]=0。
定义变量b,令b=0,只有当输入值为正数时,才开始计算和。若数据均为负数,由于sum初始值为0,输出结果即为0。
1.3 问题求解
1.3.1 根据最优子结构性质,列出递归方程式
b[ i ] = max { b[ i-1 ] + a[ i ] , a[ i ] }
1.3.2 给出填表法中表的维度、填表范围和填表顺序
维度:一维
范围:1->n
顺序:从左到右
1.3.3 分析该算法的时间和空间复杂度
时间复杂度:使用了一个for循环,因此时间复杂度为O(n)
空间复杂度:申请了b来记录最大字段和,因此空间复杂度为O(1)
1.4 心得体会(对本次实践收获及疑惑进行总结)
在做这道题时,像平时一样很自然地想要运用数组,后来看到课本的例题代码里,发现可以设一个变量记录最大子段和。
2. 你对动态规划算法的理解和体会
动态规划算法通常基于一个递推公式及一个或多个初始状态。将待求解的问题分解成若干个子问题,而当前子问题的解又将由上一次子问题的解推出。从子问题的解得出原问题的解。动态规划算法分为四步①找出最优解的性质,并刻画其结构特征②递归地定义最优值③以自底向上的方式计算最优值④根据计算最优值时得到的信息构造最优解