算法第三章上机实践报告

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. 你对动态规划算法的理解和体会

  动态规划算法通常基于一个递推公式及一个或多个初始状态。将待求解的问题分解成若干个子问题,而当前子问题的解又将由上一次子问题的解推出。从子问题的解得出原问题的解。动态规划算法分为四步①找出最优解的性质,并刻画其结构特征②递归地定义最优值③以自底向上的方式计算最优值④根据计算最优值时得到的信息构造最优解

 

posted @ 2021-10-26 19:58  Dtsuki  阅读(22)  评论(0编辑  收藏  举报