思路:
问题等价于找一个最长非降子序列。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define maxn 100005 using namespace std; int n,m,ans,cnt; int a[maxn],dp[maxn]; void solve() { int i,j,pos; dp[0]=0; cnt=0; for(i=1; i<=n; i++) { if(a[i]>=dp[cnt]) dp[++cnt]=a[i]; else { pos=upper_bound(dp,dp+cnt+1,a[i])-dp; // 找到>a[i]的第一次出现的位置 printf("i:%d pos:%d ",i,pos); dp[pos]=a[i];low } } } int main() { int i,j; while(~scanf("%d",&n)) { for(i=1; i<=n; i++) { scanf("%d",&a[i]); } solve(); printf("%d ",cnt); // 长度即为cnt 但序列不是dp保存的序列 要输出序列的话应在更新ant时记录序列 } return 0; } /* 7 2 3 3 5 3 2 4 */