最大子串和
给你n个数,求最大的子串和,如5个数1,-2,5,2,-3,5;那么最大子串和为5+2-3+5=9;
1.暴力
这就没什么好些的了两个for嵌套控制边界;算法时间复杂度就为O(n^2);
for(int i=1;i<=n;i++)//数组都是从0开始
{
for(int j=i;j<=n;j++)
ans=max(b[j]-b[i-1],ans);//ans为最终结果,b[i]为前缀和结果;
}
以下是全部代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
int main()
{
int n;
cin>>n;
int a[n+2];
int b[n+2];
b[0]=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=b[i-1]+a[i];
}
int ans=-inf;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
ans=max(ans,b[j]-b[i-1]);
}
cout<<ans<<endl;
return 0;
}
2.动态规划
设dp[i]为右边界为第i个元素的最大子串和;时间复杂度为O(n);
a.如果a[i]>=0,dp[i]=dp[i-1]+a[i];
b.如果a[i]<0,dp[i]=a[i];
int ans=-inf;
for(int i=1;i<=n;i++)//此处从0开始,因为要求dp[1]需要dp[0],而dp[0]没有dp[-1];
{
dp[i]=max(dp[i-1]+a[i],a[i]);
ans=max(ans,dp[i]);
}
以下便是全部代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
int main()
{
int n;
cin>>n;
int ans=-inf;
int dp[n+3];
int a[n+2];
dp[0]=0;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
{
dp[i]=max(dp[i-1]+a[i],a[i]);
ans=max(dp[i],ans);
}
cout<<ans<<endl;
return 0;
}
菜鸟成长,望大佬指点