About biggest and substring

And the largest substring

给你n个数,求最大的子串和,如5个数1,-2,5,2,-3,5;那么最大子串和为5+2-3+5=9;

1. Violence

这就没什么好些的了两个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]为前缀和结果;
    }

The following is the full code

#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. Dynamic Programming

设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]);
}

The following is the full code

#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;
}

A rookie growth, hope pointing Gangster

Guess you like

Origin www.cnblogs.com/monster-blog/p/11937915.html