1. 程式人生 > >Super Jumping! Jumping! Jumping! hdu1087(最大遞增子段和)

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