12----最大子段和问题

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);

猜你喜欢

转载自blog.csdn.net/Nacht_one/article/details/82147543
今日推荐