#include<bits/stdc++.h>
using namespace std;
/*
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。
对于给定的一个序列(a1, a2, ...,aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),
这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,
如(1, 7), (3, 4, 8)等等。这些子序列中序列和最大为18,为子序列(1, 3, 5, 9)的和. 你的任务
,就是对于给定的序列,求出最大上升子序列和。注意,最长的上升子序列的和不一定是最大的,
比如序列(100, 1, 2, 3)的最大上升子序列和为100,而最长上升子序列为(1, 2, 3)。
*/
int ans=INT_MIN;
void dfs(vector<int>&dp,int i,vector<int>v)
{
if(i==v.size()){return ;}
for(int j=i-1;j>=0;j--)
{
if(v[i]>v[j])
{
dp[i]=max(dp[i],v[i]+dp[j]);
}
}
ans=max(ans,dp[i]);//循环完之后
dfs(dp,i+1,v);
}
int main(){
//很标准的动规
int n;
while(cin>>n)
{
vector<int>v(n,0);
vector<int>dp(n,0);
for(int i=0;i<n;i++)//初始化
{
cin>>v[i];
dp[i]=v[i];
}
dp[0]=v[0];
//dfs(dp,0,v);
//cout<<dp[n-1];
for(int i=1;i<n;i++)//右高左低,从左往右遍历
{
for(int j=i-1;j>=0;j--)//这个其实从哪边无所谓的
{
if(v[i]>v[j])
{
dp[i]=max(dp[i],v[i]+dp[j]);//如果这个i点比j点的值大,那么dp一下
}
}
ans=max(ans,dp[i]);//循环完之后
}
cout<<ans<<endl;
// cout<<dp[3]<<dp[4]<<dp[5]<<dp[6]<<endl;
}
return 0;
}