题意:求最长不降子序列。
题解:注意 n = 0 时要输出1.
n^2算法
#include <cstdio> int main() { int dp[1005], a[1005]; int n, i, j, max; while ( scanf("%d",&n) != EOF ) { for ( i = 1; i <= n; i++ ) { scanf("%d",&a[i]); dp[i] = 1; } max = 1; for ( i = 2; i <= n; i++ ) { for ( j = 1; j < i; j++ ) if ( a[i] > a[j] && dp[j] >= dp[i] ) dp[i] = dp[j] + 1; if ( max < dp[i] ) max = dp[i]; } printf("%d\n",max); } return 0; }
n*logn算法:
#include <iostream> using namespace std; int dp[1005], a[1005]; int bfind ( int l, int r, int key ) { while ( l <= r ) { int mid = ( l + r ) / 2; if ( key <= dp[mid] ) r = mid - 1; else l = mid + 1; } return l; } int main() { int n, i, j, len; while ( scanf("%d",&n) != EOF ) { for ( i = 1; i <= n; i++ ) scanf("%d",&a[i]); dp[1] = a[1]; len = 1; for ( i = 2; i <= n; i++ ) { j = bfind ( 1, len, a[i] ); if ( j > len ) j = ++len; dp[j] = a[i]; } printf("%d\n",len); } return 0; }