浙大PAT甲级-1007

来源:互联网 发布:淘宝渠道管理在哪里 编辑:程序博客网 时间:2024/06/04 23:28

最大子段和问题

涉及算法:动态规划

思路:先求出序列中从开头到第1(2,3,4...n)个元素结尾的子段的最大子段和,整个序列的最大子段和肯定在其中;

比较就可以确定序列的最大子段和;最后确定最大子段的开头和结尾元素。

#include <iostream>#include <climits>using namespace std;int main(){    int a[10000], n, i, maxa[10000], Max=-INT_MAX, first=0, last=0;    cin>>n;    for(i=0;i<n;i++)        cin>>a[i];    maxa[0]=a[0];    for(i=1;i<n;i++)//maxa[i]表示以i结尾的字符串的最大子段和        if(maxa[i-1]<0)            maxa[i]=a[i];        else            maxa[i]=maxa[i-1]+a[i];    for(i=0;i<n;i++)        if(Max<maxa[i]){            Max=maxa[i];            last=i;        }    for(int j=0;j<=last;j++){        int x=0;        for(i=j;i<=last;i++)            x+=a[i];        if(x==Max){            first=j;            break;        }    }    if(Max<0){        Max=0;        first=0;        last=n-1;    }    cout<<Max<<" "<<a[first]<<" "<<a[last]<<endl;    return 0;}



原创粉丝点击