算法第三章上机实践报告
1.1问题描述:给出一组数字,求这组数字的最大子段和。
1.2算法描述:初始化;
设置一个max函数,在函数里面设置一个b[i],b[i]是指i前面的数字(包括i)到数字i的最大子段和;通过比较b[i](0=<i<=n),得到c(最大的b[i]),然后返回c;
在main函数里,输入n,通过for循环,输入n个数字;调用max函数,最终输出最大子段和。
1.3问题求解
1.1.1递归方程式:for(int i=1;i<=n;i++)
{b[i]=max(b[i-1],0)+a[i-1];
c=max(b[i],c);
}
1.1.2 填表 b[0]=0;
c=0;
b[1]=b[0]+a[0]=-2;
c=0;
b[2]=0+a[1]=11;(b[1]<0;舍弃b[1])
c=11;
b[3]=b[2]+a[2]=11-4=7;
c=11;
b[4]=b[3]+a[3]=7+13=20;
c=20;
b[5]=b[4]+a[4]=20-5=15;
c=20;
b[6]=b[5]+a[5]=15-2=13;
c=20;
表的维度:一维
填表范围;b[1]到b[6]
填表顺序:从左到右
1.1.3 时间复杂度:O(n)
max函数里面有一个for循环,main函数里面有一个for循环,O(n)+O(n)=2O(n),所以时间复杂度为O(n);
空间复杂度O(n^2)
max函数里,要分配空间给b[i]和c
1.3心得体会
收获:通过这次的上级,我更加熟练地掌握动态规划的知识。
疑惑:空间复杂度不知道有没有求错。
2.理解和体会
动态规划是一个可以提高效率的方法,通过动态规划,可以让时间复杂度变得更小,让代码变得更简单。