从前往后保存以每个位置结尾的最大的sum,利用前面的最大sum ,更新当前的sum就可以了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <queue>
#include <list>
#include <cmath>
using namespace std;
#define cir(a,b) memset(a,b,sizeof a)
typedef long long LL;
const int maxn = 10000+10;
int n;
int s[maxn];
int sum [maxn];
int main ()
{
while(cin >> n && n)
{
cir(s,0);
for(int i=1; i<=n; i++)
{
cin >> s[i];
}
int Max = 0;
int M_max = 0;
for(int i=1; i<=n; i++)
{
Max = 0;
for(int j=1;j<i;j++)
{
if(s[i]>s[j])
{
Max = max(sum[j],Max);
}
}
sum[i] = Max + s[i];
M_max = max(M_max , sum[i]);
}
cout << M_max <<endl;
}
return 0;
}