最長上升子序列
#include <stdio.h>

const int MAXLEN = 1010;

int num[MAXLEN];

int dp[MAXLEN];

int los ( int n )


{

dp[n-1] = 1;
for ( int i=n-2; i>=0; i-- )

{
int max = 0;
for ( int j=i+1; j<n; j++ )

{
if ( dp[j] > max && num[j] > num[i] )

{
max = dp[j];
}
}
dp[i] = max + 1;
}

int maxest = 0;
for ( i=0; i<n; i++ )

{
if ( dp[i] > maxest )

{
maxest = dp[i];
}
}

return maxest;
}

int main ()


{

int n;

while ( scanf ( "%d", &n ) != EOF )

{

for ( int i=0; i<n; i++ )

{
scanf ( "%d", &num[i] );
}
printf ( "%d\n", los ( n ) );
}
return 0;
}
#include <stdio.h>
const int MAXLEN = 1010;
int num[MAXLEN];
int dp[MAXLEN];
int los ( int n )

{
dp[n-1] = 1;
for ( int i=n-2; i>=0; i-- )
{
int max = 0;
for ( int j=i+1; j<n; j++ )
{
if ( dp[j] > max && num[j] > num[i] )
{
max = dp[j];
}
}
dp[i] = max + 1;
}
int maxest = 0;
for ( i=0; i<n; i++ )
{
if ( dp[i] > maxest )
{
maxest = dp[i];
}
}
return maxest;
} 
int main ()

{
int n;
while ( scanf ( "%d", &n ) != EOF )
{
for ( int i=0; i<n; i++ )
{
scanf ( "%d", &num[i] );
}
printf ( "%d\n", los ( n ) );
}
return 0;
}

