求一个数列的最大递增子序列和。
注意限制在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;
}