[2016-03-11][最长上升子序列]
[2016-03-11][最长上升子序列]
| O(n^2)算法,动态规划,dp[i]表示到第i个位置,最长子序列的长度,那么就有dp[i] = max(dp[i],dp[j] + 1),(j = 1,2,3,...i && a[i] > a[j]) |
const int maxn = 1000 + 100; int a[maxn],dp[maxn]; for(int i = 0; i < n ;++i){ dp[i] = 1; for(int j = 0 ; j < i ;++j){ if(a[i] > a[j]){ dp[i] = max(dp[i],dp[j] + 1); } } } int ans = 0; for(int i = 0;i < n;++i){ ans = max(ans,dp[i]); } |
|
const int maxn = 1000 + 100; int a[maxn],stk[maxn]; int n,pcur = 0; for(int i = 0;i < n;++i){ if(!pcur){ stk[pcur++] = a[i]; }else { if(a[i] > stk[pcur - 1]){ stk[pcur++] = a[i]; }else if(a[i] < stk[pcur - 1]){ int pos = lower_bound(stk,stk + pcur,a[i]) - stk; stk[pos] = a[i]; } } } |
浙公网安备 33010602011771号