Super Jumping! Jumping! Jumping! hdu1087(最大递增子段和)

题目链接

求一个数列的最大递增子序列和。

注意限制在32位整型范围内,是可能有负数的。

前i个数字的最大递增子序列和有两种情况,加上第i个数字,不加上第i个数字。前者是把i串到之前的某个子段之后一位。

#include<bits/stdc++.h>
using namespace std;
const int Max=0x3f3f3f3f;
int main()
{
    int a[1010],n,sum[1010];//sum数组保存第i个数和前面串起来以后能够达到的最大值 并不是答案
    while(cin>>n&&n!=0)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int res=a[1];
        memset(sum,-0x3f,sizeof(sum));
        sum[1]=a[1];
        for(int i=2;i<=n;i++)
        {
            //枚举每个i
            sum[i]=a[i];
            for(int j=1;j<i;j++)
                //枚举i之前的每一个数,找到比i小的数串联起i之后的最大值
                if(a[j]<a[i]) sum[i]=max(sum[i],sum[j]+a[i]);
            res=max(res,sum[i]);//sum[i]就是把i串进去,要么就不串
        }
        cout<<res<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xuzonghao/article/details/82720961