Pagini recente » Cod sursa (job #2641578) | Cod sursa (job #345394) | Cod sursa (job #1100598) | Cod sursa (job #518354) | Cod sursa (job #2610937)
/*
dp[i] = lungimea subsirului maximal crescator care incepe pe poz i(INCLUSIV ELEMENTUL i)
dp[i] = 1 + max(dp[j]) , j = 1 .. i
s[i] > s[j]
solutie: max(dp[])
*/
#include <iostream>
#include <stdio.h>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, s[100000];
int dp[100000];
int scmax(int i)
{
if (dp[i] != 0)
return dp[i];
if (i == 1)
return dp[1] = 0;
int max = 0;
for (int j = 1; j < i; j++)
if (scmax(j) > max && s[i] > s[j] )
max = scmax(j);
return dp[i] = 1 + max;
}
void scmax_()
{
for (int i = n; i >= 1; i--)
{
int max = 0;
for (int j = i + 1; j <= n; j++)
if (s[i] < s[j] && dp[j] > max)
max = dp[j];
dp[i] = 1 + max;
}
}
int main()
{
fin >> n;
for (int i = 1; i <= n; i++)
fin >> s[i];
scmax_();
int max = dp[1];
for (int i = 1; i <= n; i++)
{
cout << dp[i] << " ";
if (dp[i] > max)
max = dp[i];
}
//cout << max;
fout << max;
return 0;
}