算法第三章上机实践报告

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.理解和体会

动态规划是一个可以提高效率的方法,通过动态规划,可以让时间复杂度变得更小,让代码变得更简单。

 

   

 

                 

            

 

posted @ 2021-10-23 11:37  218  阅读(34)  评论(0编辑  收藏  举报