本次作业,我使用了两种方法,分别为枚举法和动态规划法,下面是源程序和测试结果截图

测试数据1:1 2 -3 4,最大和为4

测试数据2(全为负数):-1 -2 -3 -4 最大和-1

方法一:

代码如下

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a[100],i,j,x,sum=0,n,max=-9999;
    scanf("%d",&n);
    for(i=0;i<n;i++)
      scanf("%d",&a[i]);
    for(i=0;i<n;i++)
      for(j=n-1;j>=i;j--)
      {
      sum=0;
      for(x=i;x<=j;x++)
      sum=sum+a[x];       
      if (max<sum) max=sum;
      }
    printf("%d",max);
    system("pause");
}

 这是一种暴力算法

算法将所有可能的值全部计算,通过与max值相比较

大于max的sum将max赋值为sum

小于max的sum跳过

这种方法的好处是想法简单,但是时间复杂度高,需要长时间来执行。

通过计算,该算法的时间复杂度为O(n^3)

 

考虑到算法1的时间复杂度问题,我又写了第二个算法,该算法使用动态规划的方法进行,时间复杂度低

#include <stdio.h>
int main()
{
  int dp[100]={0};
  int a[100]={0};
  int num,max;
  int i,j,k;
  scanf("%d",&num);
  max=-9999;
  for (i=1;i<=num;i++)
  {
    scanf("%d",&a[i]);
    dp[i]=a[i]+dp[i-1];
    if (max<dp[i]) max=dp[i];
    if (dp[i]<0) dp[i]=0;
  }
  printf("%d\n",max);
}

 

 动态规划的时间复杂度经过计算仅为O(n),较之暴力枚举法快了非常多