//最大连续子序列和
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 10010;
int A[maxn],dp[maxn];
int main(){
int n;
cin>>n;
for(int i = 1 ; i <= n ; i++)
{
cin>>A[i];
}
dp[0] = 0;
for(int i = 1 ; i <= n ; i++)
{
dp[i]=max(A[i],A[i]+dp[i-1]);
}
int res=-0x3f3f3f;
for(int i = 1 ; i <= n ;i++)
{
if(dp[i]>res){
res = dp[i];
}
}
cout<<res;
}
//最长不下降子序列
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10010;
int A[maxn],dp[maxn];
int main(){
int n;
cin>>n;
for(int i = 1 ; i <= n ;i++)
{
cin>>A[i];
}
int res = -1;
for(int i = 1 ; i <= n ;i++)
{
dp[i] = 1;
for(int j = 1; j < i ; j++)
{
if(A[i]>=A[j]&&dp[j]+1>dp[i])
{
dp[i] = dp[j] + 1;
}
}
res = max(res,dp[i]);
}
cout<<res;
}
//最长公共子序列
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10010;
char A[maxn],B[maxn];
int dp[maxn][maxn];
int main(){
gets(A+1);
gets(B+1);//从下表为1开始读
int lenA = strlen(A+1);
int lenB = strlen(B+1);
for(int i = 0 ; i < lenA ; i++)
{
dp[i][0] = 0;
}
for(int i = 0 ; i < lenB ; i++)
{
dp[0][i] = 0;
}
int res = -1;
for(int i = 1; i <= lenA; i++)
{
for(int j = 1; j <=lenB; j++)
{
if(A[i]==B[j]){
dp[i][j] = dp[i-1][j-1]+1;
res = max(res,dp[i][j]);
}
else{
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
}
//cout<<res;
cout<<dp[lenA][lenB];
}
//最长回文子串
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10010;
char S[maxn];
int dp[maxn][maxn];//dp表示S[I]到S[J]的子串是否是回文字串,是为1,不是为0;
int main(){
gets(S);
int len = strlen(S);
int ans = 1;
memset(dp,0,sizeof(dp));
//边界
for(int i = 0 ; i < len ; i++)
{
dp[i][i] = 1;
if(i < len - 1)
{
if(S[i]==S[i+1]){
dp[i][i+1] = 1;
ans = 2;
}
}
}
//状态转移方程
for(int L = 3; L <= len; L++)
{
for(int i = 0 ; i+L-1 < len; i++)
{
int j = i+L-1;
if(S[i]==S[j]&&dp[i+1][j-1]==1){
dp[i][j]=1;
ans = L;
}
}
}
cout<<ans;
}