1.穷举法—-暴力解决问题
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstring>
#include<iomanip>
#include<math.h>//取尺法
using namespace std;
int s[100005];
int main()
{
int T,n;
scanf("%d",&T);
for(int k=1; k<=T; k++)
{
int l,r,ans=0,sum,a,b;
memset(s,0,sizeof(s));
scanf("%d",&n);
for(int j=1; j<=n; j++)//确定初始位置
scanf("%d",&s[j]);
for(l=1; l<=n&&s[l]>=0; l++)//确定末位置
{
sum=0;
a=l;
b=l;
for(r=l; r<=n; r++)
{
sum+=s[r];
if(sum>=ans)
{
ans=sum;
a=l;
b=r;
}
}
}
printf("Case %d:\n%d %d %d\n",k,ans,a,b);
if(k<T)
printf("\n");
}
return 0;
}
此代码为自己为ACM而写,但不AC,只可借鉴方法
时间复杂度为O(n*n*n)
2.动态规划算法:是一种思想,不是一种算法
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstring>
#include<iomanip>
#include<math.h>
using namespace std;
int s[100005];
int main()
{
int T,n;
scanf("%d",&T);
for(int k=1; k<=T; k++)
{
int ans=0,sum;
memset(s,0,sizeof(s));
scanf("%d",&n);
for(int j=1; j<=n; j++)
scanf("%d",&s[j]);
sum=s[1];
for(int i=1;i<=n;i++)
{
if(ans>0)/*如果前面相加的和小于0,就没有必要保留,因为任何一个数加上小于0的数都小于这个数*/
ans+=s[i];
else ans=s[i];
if(ans>=sum)//更新最大值
sum=ans;
}
printf("Case %d:\n%d\n",k,sum);
if(k<T)
printf("\n");
}
return 0;
}
此算法时间复杂度为O(n);