本次作业,我使用了两种方法,分别为枚举法和动态规划法,下面是源程序和测试结果截图
测试数据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),较之暴力枚举法快了非常多